zoukankan      html  css  js  c++  java
  • struts2结果处理、获取参数(二)

    结果处理

      1.转发

        type可以不写,默认就是转发    

        <package name="hello" namespace="/hello" extends="struts-default">
            <action name="HelloAction" class="com.struts2.web.HelloAction" method="hello">
                <result name="success" type="dispatcher">/index.jsp</result>
            </action>
        </package>

        运行后浏览器地址不变

      2.重定向

        type="redirect" 就是重定向

        <package name="hello" namespace="/hello" extends="struts-default">
            <action name="HelloAction" class="com.struts2.web.HelloAction" method="hello">
                <result name="success" type="redirect">/index.jsp</result>
            </action>
        </package>

        运行后浏览器地址变为index.jsp了

      3.转发到Action(不常用)

        运行后地址不变

        <package name="hello" namespace="/hello" extends="struts-default">
            <action name="HelloAction" class="com.struts2.web.HelloAction" method="hello">
                <result name="success" type="chain">
                    <param name="actionName">HaHaAction</param>
                    <!--要转发的命名空间 -->
                    <param name="namespace">/hello</param>
                </result>
            </action>
            <action name="HaHaAction" class="com.struts2.web.UserAction" method="Add">
                <result name="success">/chain.jsp</result>
            </action>
        </package>

        先执行hello 执行完毕后 再执行Add 

      4.重定向到Action

        运行后地址变为/hello/HaHaAction.action (默认.action 或不写)

        <package name="hello" namespace="/hello" extends="struts-default">
            <action name="HelloAction" class="com.struts2.web.HelloAction" method="hello">
                <result name="success" type="redirectAction">
                    <param name="actionName">HaHaAction</param>
                    <!--要转发的命名空间 -->
                    <param name="namespace">/hello</param>
                </result>
            </action>
            <action name="HaHaAction" class="com.struts2.web.UserAction" method="Add">
                <result name="success">/chain.jsp</result>
            </action>
        </package>

        

    获得原生ServletAPI

      struts2 中 有一个ActionContext 数据中心对象 通过他可以获得

        原生request、原生response、原生ServletContext、request域、session域、application域、param参数、attr域 分别对应

        HttpServletRequest、HttpServletResponse、ServletContext、 四大域和param参数都是Map 通过setAttribute 和getAttribute 分别设置和获取他们的Map键值对 attr域是(request域、session域、application域 三合一)

        ActionContext 数据中心 也是一个Map

        ActionContext生命周期:每次请求时都会创建一个与请求对应的ActionContext对象,请求处理完ActionContext销毁。

          获得ActionContext对象,struts2设计的是,将ActionContext对象创建好之后,将ActionContext与当前线程绑定。我们要获得ActionContext,只需要从ThreadLocal中获得即可。

      方式1.通过ActionContext

    public class HelloAction extends ActionSupport{
        public String hello(){
            //request域(struts2并不推荐获取原生request域)
            Map<String, Object> requestScope = (Map<String, Object>) ActionContext.getContext().get("request");
            //推荐设置request域方式
            ActionContext.getContext().put("requestKey","requestValue");
    
            //session域
            Map<String, Object> sessionScope = ActionContext.getContext().getSession();
            sessionScope.put("name","zhagnsan");
            //application域
            Map<String, Object> applicationScope = ActionContext.getContext().getApplication();
            applicationScope.put("username","zhangsan");
    
    
            return "success";
        }
    }
      <body>
      ${request.requestKey}
      ${session.name}
      ${application.username}
      </body>

      方式2.通过ServletActionContext(代码中其实也是从ActionContext中获得的) struts不推荐原生的

    public class HelloAction extends ActionSupport{
        public String hello(){
            //原生request
            HttpServletRequest request = ServletActionContext.getRequest();
            //原生resposne
            HttpServletResponse response = ServletActionContext.getResponse();
            //原生session
            HttpSession session = request.getSession();
            //原生ServletContext
            ServletContext servletContext = ServletActionContext.getServletContext();
    
            return "success";
        }
    }

      方式3.实现接口的方式(实现各自对应的接口)(通过拦截器完成的)

    public class HelloAction extends ActionSupport implements ServletRequestAware{
        private HttpServletRequest request;
        public String hello(){
            request.setAttribute("adsf","sdf");
    
            return "success";
        }
    
        @Override
        public void setServletRequest(HttpServletRequest httpServletRequest) {
            this.request = request;
        }
    }

    获取参数

      方式1.属性驱动获得参数(只能转换8大基本数据类型及对应包装类和Date日期类)

    设置带get set方法的属性  参数名要与属性名一致 (每次请求Action时都会创建新的Action实例对象,struts是线程安全的,可以使用成员变量接收参数。servlet不行)

      <form action="${pageContext.request.contextPath}/User/User_Add">
        <input name="name">
        <button type="submit">提交</button>
      </form>
    import com.opensymphony.xwork2.ActionSupport;
    
    public class UserAction extends ActionSupport {
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
        public String Add(){
    
            System.out.println(name);
    
            return "success";
        }
    }

      方式2.对象驱动  新建一个user类

    package com.struts2.domain;
    
    public class User {
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        private String name;
    
    }

    提交表单时,名字设置为user.name

      <form action="${pageContext.request.contextPath}/User/User_Add">
        <input name="user.name">
        <button type="submit">提交</button>
      </form>

    action中

    package com.struts2.web;
    
    import com.opensymphony.xwork2.ActionSupport;
    import com.struts2.domain.User;
    
    public class UserAction extends ActionSupport {
        private User user = new User();
        public String Add(){
            System.out.println(user);
            return "success";
        }
    }

      方式3.模型驱动(缺点只能返回一个对象)

    User类不变,前台不需要user.name了

      <form action="${pageContext.request.contextPath}/User/User_Add">
        <input name="name">
        <button type="submit">提交</button>
      </form>

    Action实现ModelDriven<T>接口

    package com.struts2.web;
    
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.ModelDriven;
    import com.struts2.domain.User;
    
    public class UserAction extends ActionSupport implements ModelDriven<User>{
        private User user = new User();
        public String Add(){
            user = getModel();
            System.out.println(user);
            return "success";
        }
    
        @Override
        public User getModel() {
            return user;
        }
    }

    集合类型参数

    public class UserAction extends ActionSupport{
        public List<String> getList() {
            return list;
        }
    
        public void setList(List<String> list) {
            this.list = list;
        }
    
        private List<String> list;
        public String Add(){
            System.out.println(list.size());
            return "success";
        }
    }
      <form action="${pageContext.request.contextPath}/User/User_Add" method="post">
        <input name="list[0]">
        <input name="list[1]">
        <button type="submit">提交</button>
      </form>
  • 相关阅读:
    HDU 2192 MagicBuilding
    HDU 2148 Score
    HDU 1847 Good Luck in CET4 Everybody!
    往CImageList中加图标列表
    LoadIcon
    OnInitialUpdate 详解
    设备坐标(DP)、客户坐标(Client)、逻辑坐标(LP)
    Web及网络基础学习(一)
    Qt 下QMessageBox下中文乱码问题
    vs2005菜单:选项项目和解决方案
  • 原文地址:https://www.cnblogs.com/baidawei/p/9068649.html
Copyright © 2011-2022 走看看