• Struts2使用


      Struts2是一个基于MVC设计模式的Web应用框架。在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。

      接下来,我们先看下Struts2与SpringMVC的比较,然后再通过一个案例演示Struts2框架的使用。

      Struts2与SpringMVC的区别:

      1.框架机制

      (1)Struts2采用Filter(StrutsPrepareAndExecuteFilter)实现,SpringMVC(DispatcherServlet)则采用Servlet实现。
      (2)Filter在容器启动之后即初始化;服务停止以后坠毁,晚于Servlet。Servlet在是在调用时初始化,先于Filter调用,服务停止后销毁。

      2.拦截机制

      (1)Struts2
      a、Struts2框架是类级别的拦截,每次请求就会创建一个Action,和Spring整合时Struts2的ActionBean注入作用域是原型模式prototype(否则会出现线程并发问题),然后通过setter,getter把request数据注入到属性。
      b、Struts2中,一个Action对应一个request,response上下文,在接收参数时,可以通过属性接收,这说明属性参数是让多个方法共享的。
      c、Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。
      (2)SpringMVC
      a、SpringMVC是方法级别的拦截,一个方法对应一个Request上下文,所以方法基本上是独立的,独享request,response数据。而每个方法同时又和一个url对应,参数的传递是直接注入到方法中的,是方法所独有的。处理结果通过ModeMap返回给框架。
      b、在Spring整合时,SpringMVC的Controller Bean默认采用单例模式Singleton,所以默认对所有的请求,只会创建一个Controller,所以是线程安全的,如果要改变默认的作用域,需要添加@Scope注解修改。

      3.性能方面  
      SpringMVC实现了零配置,由于SpringMVC基于方法的拦截,加载一次单例模式bean注入即可。而Struts2是类级别的拦截,每次请求对应实例化一个新的Action,需要加载所有的属性值注入,所以,SpringMVC开发效率和性能高于Struts2。

      4.拦截机制

      Struts2有自己的拦截Interceptor机制,SpringMVC是用独立的Aop方式,这样导致Struts2的配置文件量比SpringMVC要大。

      5.配置方面

      spring MVC和Spring是无缝的。从项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要进行较多的xml配置)。SpringMVC基本上可以认为已经100%零配置。

      6.设计思想

      Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,是在servlet上扩展。

      7.集成方面

      SpringMVC集成了Ajax,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器虽然也集成了Ajax,但在Action中处理时,一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。

      好了,接下来写一个采用Struts2框架的web案例。

      项目案例架构如下:

      引入Struts2的jar包如下所示:

      

    //A.java
    
    package com.itszt.web;
    import org.apache.struts2.ServletActionContext;
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    /**
     * 演示通过Struts2框架获取Response响应对象,
     * Request请求对象,
     * ServletContext上下文,
     * Session会话对象
     */
    public class A {
        public void go() {
            HttpServletResponse response = ServletActionContext.getResponse();
            HttpServletRequest request = ServletActionContext.getRequest();
            ServletContext servletContext = ServletActionContext.getServletContext();
            HttpSession session = request.getSession();
        }
    }
    

       struts2.xml配置文件: 

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
            "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
            "http://struts.apache.org/dtds/struts-2.3.dtd">
    <struts>
        <!--映射访问路径配置,还配置了返回的结果页-->
        <package name="test" extends="struts-default" >
            <action name="TestAction1" class="com.itszt.web.TestAction1" method="execute">
                <result name="success"  >/success.jsp</result>
            </action>
        </package>
        <!--namespace为该Action路径的前导位置-->
        <package name="userCenter" extends="struts-default" namespace="/userCenter">
            <!--type  结果类型  默认是dispatcher  即转发到指定结果页-->
            <!--type:  redirect  重定向到指定结果页-->
            <!--type: chain 转发到指定Action-->
            <!--type: redirectAction 重定向到指定Action-->
            <action name="login" class="com.itszt.web.UserCenterAction" method="doLogin">
                <result name="success" type="redirect">/success.jsp</result>
                <result name="error">/error.jsp</result>
            </action>
            <action name="reg" class="com.itszt.web.UserCenterAction" method="doReg">
                <result name="success">/success.jsp</result>
                <result name="error">/error.jsp</result>
            </action>
        </package>
    </struts>
    

       web.xml配置文件:

      

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             version="3.1">
        <!--配置Struts2过滤器-->
        <filter>
            <filter-name>struts2</filter-name>
            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
            <init-param>
                <param-name>config</param-name>
                <param-value>struts-default.xml,struts-plugin.xml,../struts2.xml</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>struts2</filter-name>
            <!--过滤的后缀名-->
            <url-pattern>*.action</url-pattern>
            <url-pattern>*.do</url-pattern>
        </filter-mapping>
    </web-app>
    

       前端页面如下:

    <%--index.jsp文件--%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>Struts2测试</title>
      </head>
      <body>
      <a href="/TestAction1.action?data=我是data">找一个后台的Action,Action是什么呢?就是以前的controller</a>
      <hr>
      <a href="/userCenter/login.action?username=1">测试login。。。success</a>  <hr>
      <a href="/userCenter/login.action?username=2">测试login。。。error</a>  <hr>
      <a href="/userCenter/reg.action">测试reg。。。</a>  <hr>
      </body>
    </html>
    
    -------------------------------------------------------------------------------
    <%--success.jsp文件--%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Struts2测试</title>
    </head>
    <body>
    success.jsp...............
    </body>
    </html>
    
    --------------------------------------------------------------------------------
    <%--error.jsp文件--%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Struts2测试</title>
    </head>
    <body>
    error.jsp................
    </body>
    </html>
    

       服务器端的Action如下:

    //TestAction1.java文件
    package com.itszt.web;
    import com.opensymphony.xwork2.ActionSupport;
    import org.apache.struts2.ServletActionContext;
    import javax.servlet.http.HttpServletRequest;
    /**
     * 相当于springmvc里的controller,继承ActionSupport
     */
    public class TestAction1 extends ActionSupport {
        @Override
        public String execute() throws Exception {
    //        HttpServletResponse response = ServletActionContext.getResponse();
            HttpServletRequest request = ServletActionContext.getRequest();
            String data = request.getParameter("data");
    //        ServletContext servletContext = ServletActionContext.getServletContext();
    
            System.out.println("TestAction1.execute -----> "+data);
    
            return "success";
        }
    }
    
    ---------------------------------------------------------
    //UserCenterAction.java文件
    package com.itszt.web;
    import org.apache.struts2.ServletActionContext;
    import javax.servlet.http.HttpServletRequest;
    /**
     * 服务器端的Action
     */
    public class UserCenterAction {
        public String doLogin(){
            HttpServletRequest request = ServletActionContext.getRequest();
            String username1 = request.getParameter("username");
            System.out.println("username1 = " + username1);
            System.out.println("UserCenterAction.doLogin");
            if ("1".equals(username1)) {
                return "success";
            }else {
                return "error";
            }
        }
    
        public String doReg(){
            System.out.println("UserCenterAction.doReg");
            return "success";
        }
    }
    

       上述项目案例运行在tomcat服务器上,可以实现正常的访问。如有问题请留言联系。

  • 相关阅读:
    Java的运行机制
    java小项目之:植物大战僵尸,这个僵尸有点冷!内附素材源码
    学习Java必须避开的十大致命雷区,千万不要踩!
    教你从零开始学习java正则表达式!
    java小项目之:扫雷,这游戏没有你想的那么简单!
    CentOS 旧版下载地址
    yum相关变量浅析
    在 CentOS 中部署 KMS 服务器(vlmcsd)
    CentOS 6.x 重置root 密码
    1-VCP 框架
  • 原文地址:https://www.cnblogs.com/lizhangyong/p/8869893.html
Copyright © 2020-2023  润新知