Struts2框架总结

4 篇文章 0 订阅

Struts2简介

  1. 介绍

Struts1–>Struts2–>Spring MVC
Struts1(Apache)–>Webwork(opensymphony)–>Struts2(Apache)

2. 结构和流程

基于MVC结构(xwork),用于开发Java Web程序。

  • spring mvc


  • struts2 mvc

  • 对比
    StrutsPrepareAndExecuteFilter等价于DispatcherServlet
    Action等价于Controller Result等价于ViewResolver

Struts2的基本使用

  1. 环境搭建
  • 添加struts2开发包
  • 添加src/struts.xml主配置文件
  1. 流程设计

请求–>Filter控制器–>Action–>Result–>响应/hello.action–>Filter控制器–>HelloAction–>Result(dispatcher)–>/WEB-INF/hello.jsp–>HTML界面响应

3. 流程的实现

  • 编写Action
  • 编写JSP

4. 流程的配置

- Filter控制器配置(web.xml)

          <filter>
            <filter-name>strutsmvc</filter-name>
            <filter-class>
            org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
            </filter-class>
            <!-- 默认加载src/struts.xml -->
          </filter>

          <filter-mapping>
            <filter-name>strutsmvc</filter-name>
            <url-pattern>*.action</url-pattern>
          </filter-mapping>

- Action配置(struts.xml)

<!-- name请求名;class是Action类名;method是Action方法名,默认execute -->
        <action name="hello" class="cn.xdl.action.HelloAction">

            <!--定义result-->

        </action>

- Result配置(struts.xml)


/WEB-INF/hello.jsp

主控制器StrutsPrepareAndExecuteFilter

  • 负责接收用户请求(一个请求创建一个Action)
  • 负责调用Action中请求处理方法
  • 负责根据Action返回值调用Result处理
  • 默认情况下,Filter控制器只处理*.action或没有扩展名的请求,只有符合请求才能进入Action调用流程。
  • 如果需要修改请求扩展名,可以在struts.xml中追加下面配置

<constant name="struts.action.extension" value="do"/>

  • Filter查找Action时,按namespace精确匹配,没有会向父路径查找。例如/day01/a/b/hello,会查找namespace=/day01/a/b,没有时会继续查找/day01/a,再没有会继续查找/day01

Action

1.编写规则

  • 请求处理方法

    对应请求处理,固定格式如下:

public String xxx(){
            //请求处理逻辑,调用Model组件
        }
  • 属性

    可以接收请求参数、可以向响应JSP传值

    public class HelloAction {
    
        private String msg;//在响应JSP中使用${msg}
        private List<City> cities;
    
        public List<City> getCities() {
            return cities;
        }
    
        public void setCities(List<City> cities) {
            this.cities = cities;
        }
    
        public String getMsg() {
            return msg;
        }
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
    
        //public String xxx(){}
        public String execute(){
            System.out.println("执行了HelloAction");
            msg = "欢迎学习Struts2";
            cities = new ArrayList<City>();
            cities.add(new City(1,"北京"));
            cities.add(new City(2,"沈阳"));
            cities.add(new City(3,"成都"));
            cities.add(new City(4,"上海"));
            return "success";//返回是result标识名,对应<result name="success">
        }
    
    }
    

2.配置规则

<package>
    <action name="请求名" class="类" method="方法名">
    </action>

    <action name="请求名">
    </action>
</package>

//class属性不指定,默认调用ActionSupport类
public class ActionSupport{

   public String execute(){
       return "success";
   }

}

例:

登录功能

  1. 页面跳转功能(显示登录页面)

    如果没有业务处理逻辑,只是单纯的页面跳转,可以使用框架提供的ActionSupport组件。

    /tologin.do–>Filter控制器–>ActionSupport
    –>Result(dispatcher)–>/WEB-INF/login.jsp

  2. 登录按钮处理

    /login.do–>Filter控制器–>LoginAction
    –>Result–>成功/WEB-INF/ok.jsp;失败/WEB-INF/login.jsp

Requst、Session、Application的使用

1. Map封装原理:

public class SessionMap extends AbstractMap{

            private HttpSession httpSession;

            public SessionMap(HttpServletRequest request){
                httpSession = request.getSession();
            }

            public void put(Object key,Object value){
                httpSession.setAttribute(key.toString(),value);
            }

            public Object get(Object key){
                return httpSession.getAttribute(key.toString());
            }

        }


    Map session = new SessionMap(request);

2. 使用建议


  • Action对象使用,建议采用Aware接口注入


- Map类型接口:
RequestAware、SessionAware、ApplicationAware

- Servlet类型接口:
ServletRequestAware、ServletResponseAware、ServletContextAware


- Action对象以外使用,只能用ActionContext或ServletActionContext

- Map类型接口:用ActionContext获取
- Servlet类型接口:用ServletActionContext获取
请求–>filter控制器–>拦截器1/拦截器2–>Action–>Result–>拦截器2/拦截器1–>响应输出

内置拦截器

params:将请求参数从request提取,然后给Action属性赋值 defaultStack:默认执行的一个拦截器栈。

自定义拦截器

  1. 编写拦截器实现类,实现Interceptor接口(或者继承AbstractInterceptor)

  2. 在struts.xml中配置拦截器

<interceptors>
            <interceptor name="myinter" class="cn.xdl.interceptor.MyInterceptor"/>
        </interceptors>

3. 使用拦截器

<action name="list" class="listAction">
            <interceptor-ref name="myinter"/>
            <interceptor-ref name="defaultStack"/>
            <result name="success" type="mydispatcher">
                <param name="url">/WEB-INF/list.jsp</param>
            </result>
        </action>
提示:为Action指定了拦截器后,默认defaultStack拦截器不再执行,需要显式调用下。

熟悉框架主要组件

  1. StrutsPrepareAndExecuteFilter
  2. Action
  3. Result
  4. Interceptor
  5. ValueStack

熟悉框架组件功能和规则

StrutsPrepareAndExecuteFilter

1. 功能

主控制器(前端控制器),控制请求处理流程。
- 请求来进入Filter控制器
- Filter控制器创建ValueStack对象并初始化
- Filter控制器根据struts.xml调用defaultStack拦截器栈
- Filter控制器根据struts.xml调用Action处理
- Filter控制器会根据Action返回值+struts.xml调用Result处理
- Filter控制器销毁ValueStack对象信息
- Filter控制器将Result生成的响应信息输出

2. 规则

  • 编写规则
public class MyFilter implements  Filter{

                public void doFilter(ServletRequest arg0, 
                        ServletResponse arg1, FilterChain chain)
                        throws IOException, ServletException {
                    //判断请求扩名是否为.action或没有
                //      if(是Actoin请求){
                //          - Filter控制器创建ValueStack对象并初始化
                //          - Filter控制器根据struts.xml调用defaultStack拦截器栈
                //          - Filter控制器根据struts.xml调用Action处理
                //          - Filter控制器会根据Action返回值+struts.xml调用Result处理
                //          - Filter控制器销毁ValueStack对象信息
                //          - Filter控制器将Result生成的响应信息输出
                //      }else{
                //          chain.doFilter(arg0, arg1);//放过,调用jsp、jpg、js、css
                //      }

                }


            }
  • 配置规则
    <filter>
                <filter-name>strutsmvc</filter-name>
                <filter-class>
                org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
                </filter-class>
                <!-- 默认加载src/struts.xml -->
            </filter>

            <filter-mapping>
                <filter-name>strutsmvc</filter-name>
                <url-pattern>/*</url-pattern>
            </filter-mapping>

Action

1. 功能

业务控制器,请求到达Action,Action可以获取到请求参数、可以调用Model组件处理请求、可以将处理结果返回。

  • 一个请求对应一个Action对象
  • 利用Action属性接收请求参数
  • 利用Action属性返回处理结果
  • 利用Action方法调用Model组件处理请求,默认方法名为execute

2. 规则

  • 编写规则
public class xxxAction (extends ActionSupport){
            //根据请求参数key定义属性
            //根据传出结果类型定义属性

            public String execute(){
                //调用Model组件处理
            }
        }
  • 使用Request、Session、Application对象

实现Aware接口、ActionContext、ServletActionContext

  • 配置规则(struts.xml)
<package name="xx" namespace="/" extends="struts-default|json-default">
    <action name="请求名" class="" method="">
    </action>
</package>

Result

1. 功能

用于生成响应信息。(调用jsp生成响应hmtl、将action属性以json或字节流输出)

2. 规则

  • 编写规则
            public class XxxResult implements Result{
                public void execute(ActionInvocation arg0) throws Exception {
                    //编写响应逻辑(调用jsp生成响应hmtl、将action属性以json或字节流输出)
                }
            }
  • 配置规则

    使用(熟悉)

 <result name="Action方法返回值" type="result类型名">
  <param > name="属性名">参数值</param>  </result>

装配

<result-types>    
<result-type name="result类型名" class="result实现类"/>     </result-types> 
</package> 

Interceptor

1. 功能

拦截器可以对请求处理进行拦截,可以插入共通处理逻辑进去,也可以打断Action执行。
例如框架提供了大量的拦截器,封装了很多共通处理。典型的params、fileupload、defaultStack等

2. 规则

  • 编写规则(基本掌握)
        public class XxxxInterceptor implements Interceptor{

            public String intercept(ActionInvocation ai) 
                throws Exception {
                //插入逻辑或打断Action执行
                ai.invoke();//执行Action,如果不调用就是打断执行
            }

        }
  • 配置规则
    使用配置(掌握)
<action>
    <interceptor-ref name="拦截器名"/>
    <interceptor-ref name="defaultStack"/>
    <result>
    </result>
</action>
  • 装配配置
<package>
    <interceptors>
    <interceptor name="拦截器名" class="拦截器类"/>
    </interceptors>
</package>

ValueStack

1. 作用

ValueStack被称为值栈。用于存储请求处理相关的数据对象。例如request、session、application、action、parameters等

存储结构如下:

2. 访问原理

利用OGNL工具解析ValueStack。Object Graphics Navigation Language对象图导航语言。

Ognl.getValue(“OGNL表达式”,context,root)
Ognl.setValue(“OGNL表达式”,context,root,value)

熟悉框架组件处理流程

  • 请求来进入Filter控制器
  • Filter控制器创建ValueStack对象并初始化
  • Filter控制器根据struts.xml调用defaultStack拦截器栈
  • Filter控制器根据struts.xml调用Action处理
  • Filter控制器会根据Action返回值+struts.xml调用Result处理
  • Filter控制器销毁ValueStack对象信息
  • Filter控制器将Result生成的响应信息输出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值