Struts2入门-02

本文介绍 Struts2 中结果页面的配置方法,包括全局与局部结果页面的区别,以及不同类型的页面跳转方式。同时,还详细讲解了 Struts2 如何通过拦截器实现参数的自动封装,包括普通属性、对象属性、模型驱动等机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

结果页面跳转

结果页面的两种方式

* 全局结果页面
    > 条件:如果<package>包中的一些action都返回success,并且返回的页面都是同一个JSP页面
      ,这样就可以配置全局的结果页面。
    > 全局结果页面针对的当前的包中的所有的Action,但是如果局部还有结果页面,会优先局部的。
      使用的标签是
        <global-results>
            <result>/demo3/suc.jsp</result>
        </global-results>

* 局部结果页面
    <result>/demo3/suc.jsp</result>

结果页面类型

* 结果页面使用<result>标签进行配置,包含两个属性
    > name  -- 逻辑视图的名称
    > type  -- 跳转的类型,值一些,需要掌握一些常用的类型。常见的结果类型去struts-default.xml中查找。
        * dispatcher        -- 转发.type的默认值.Action--->JSP
        * redirect          -- 重定向. Action--->JSP
        * chain             -- 多个action之间跳转.从一个Action转发到另一个Action.  Action---Action
        * redirectAction    -- 多个action之间跳转.从一个Action重定向到另一个Action. Action---Action
        * stream            -- 文件下载时候使用的
<!--常见的配置-->
    <!--  转发 -->
        <action name="Demo1Action" class="cn.itheima.a_result.Demo1Action" method="execute" >
            <result name="success" type="dispatcher" >/hello.jsp</result>
        </action>
    <!-- 重定向 -->
        <action name="Demo2Action" class="cn.itheima.a_result.Demo2Action" method="execute" >
            <result name="success" type="redirect" >/hello.jsp</result>
        </action>
    <!-- 转发到Action -->
        <action name="Demo3Action" class="cn.itheima.a_result.Demo3Action" method="execute" >
             <result name="success" type="chain">
                    <!-- action的名字 -->
                 <param name="actionName">Demo1Action</param>
                    <!-- action所在的命名空间 -->
                 <param name="namespace">/</param>
             </result>
        </action>
        <!-- 重定向到Action -->
        <action name="Demo4Action" class="cn.itheima.a_result.Demo4Action" method="execute" >
            <result  name="success"  type="redirectAction">
                 <!-- action的名字 -->
                 <param name="actionName">Demo1Action</param>
                 <!-- action所在的命名空间 -->
                 <param name="namespace">/</param>
            </result>
        </action>

访问ServletAPI方式

原理

image

通过ActionContext(常用)
  • 获取Servlet中的域对象(原来域对象中的集合)
public class Demo5Action extends ActionSupport {

    public String execute() throws Exception {
        //request域=> map (struts2并不推荐使用原生request域)
        //不推荐,因为request的声明周期跟ActionContext相同
        //所以推荐使用ActionContext
        //其实在源码中struts是对request进行了增强,将request的getAttribute
        //进行了增强,会在原方法的基础上默认会调用ActionContext中的getAttribute
        //方法,所以就能解释在jsp中可以直接从request域中取了


        Map<String, Object> requestScope = (Map<String, Object>) ActionContext.getContext().get("request");
        //推荐
        ActionContext.getContext().put("name", "requestTom");
        //session域 => map
        Map<String, Object> sessionScope = ActionContext.getContext().getSession();
        sessionScope.put("name", "sessionTom");
        //application域=>map
        Map<String, Object> applicationScope = ActionContext.getContext().getApplication();
        applicationScope.put("name", "applicationTom");

        return SUCCESS;
    }

}
通过ServletActionContext
  • 获取原生的ServletAPI
    //并不推荐 我们要用了框架了所以要脱离原生
    public String execute() throws Exception {
        //原生request
        HttpServletRequest request = ServletActionContext.getRequest();
        //原生session
        HttpSession session = request.getSession();
        //原生response
        HttpServletResponse response = ServletActionContext.getResponse();
        //原生servletContext
        ServletContext servletContext = ServletActionContext.getServletContext();
        return SUCCESS;
    }


}
通过实现接口的方式
public class Demo7Action extends ActionSupport implements ServletRequestAware {


    private HttpServletRequest request;

    public String execute() throws Exception { 

        System.out.println("原生request:"+request);
        return SUCCESS;
    }

    @Override
    public void setServletRequest(HttpServletRequest request) {
        this.request = request;
    }


}

总结

虽然获取方式各不相同但是都是从ActionContext中获取的详情请见源码

如何获取参数

struts2的参数封装是通过拦截器来实现的,需要你写的Action类中提供属性的方法

拓展

MVC
  • mvc思想 && J2EE mvc思想的体现

image

  • Struts2 MVC思想的体现

image

Action的声明周期
  • 每次请求到来时,都会 创建一个新的Action对象实例
  • Action是线程安全的,可以使用成员变量来接收参数

属性驱动获得参数

  • 普通属性
//struts2如何获得参数
//每次请求Action时都会创建新的Action实例对象
public class Demo8Action extends ActionSupport  {

    public Demo8Action() {
        super();
        System.out.println("demo8Action被创建了!");
    }


    //准备与参数键名称相同的属性
    private String name;
    //自动类型转换 只能转换8大基本数据类型以及对应包装类
    private Integer age;
    //支持特定类型字符串转换为Date ,例如 yyyy-MM-dd
    private Date   birthday;


    public String execute() throws Exception { 

        System.out.println("name参数值:"+name+",age参数值:"+age+",生日:"+birthday);

        return SUCCESS;
    }

    ..get/set方法

    // 普通属性的参数绑定
    // get方法可以不提供但是 set方法一定要提供

}
  • 对象
    <form action="${pageContext.request.contextPath}/Demo9Action">
        用户名:<input type="text" name="user.name" /><br>
        年龄:<input type="text" name="user.age" /><br>
        生日:<input type="text" name="user.birthday" /><br>
        <input type="submit" value="提交" />
    </form>


public class Demo9Action extends ActionSupport  {
    //准备user对象
    private User user;

    public String execute() throws Exception { 

        System.out.println(user);

        return SUCCESS;
    }

// 必须提供对象的get方法

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

}   

模型驱动获得参数 ModelDriven


    <form action="${pageContext.request.contextPath}/Demo10Action">
        用户名:<input type="text" name="name" /><br>
        年龄:<input type="text" name="age" /><br>
        生日:<input type="text" name="birthday" /><br>
        <input type="submit" value="提交" />
    </form>


//struts2如何获得参数-方式2
public class Demo10Action extends ActionSupport implements ModelDriven<User> {


//通过实现ModelDriven接口(模型驱动)接口,来接受请求参数,并且要重写
//getModel()方法,这个方法的返回值就是Action所使用的数据模型对象
//JavaBean所封装的属性与表单的属性一一对应



    //准备user 成员变量
    //记得要new 哦!!!!
    private User user =new User();

    public String execute() throws Exception { 

        System.out.println(user);

        return SUCCESS;
    }

    @Override
    public User getModel() {
        return user;
    }

}

封装集合类型的数据

封装到List,map集合中
<body>
    <form action="${pageContext.request.contextPath}/Demo11Action" method="post" >
        list:<input type="text" name="list" /><br>
        list:<input type="text" name="list[3]" /><br>
        map:<input type="text" name="map['haha']" /><br>
        <input type="submit" value="提交" />
    </form>
</body>


public class Demo11Action extends ActionSupport  {
    //list
    private List<String> list;
    //Map
    private Map<String,String> map;


    public String execute() throws Exception { 

        System.out.println("list:"+list);
        System.out.println("map:"+map);

        return SUCCESS;
    }

    public List<String> getList() {
        return list;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public Map<String, String> getMap() {
        return map;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值