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>

猜你喜欢

转载自www.cnblogs.com/baidawei/p/9068649.html