• Struts和Spring MVC的比较(非原创)


    文章大纲

    一、Spring MVC项目例子
    二、Struts项目例子
    三、Struts和Spring MVC对比
    四、参考文章

     

    一、Spring MVC项目例子

    https://www.jianshu.com/p/c5a45803718e

    二、Struts项目例子

    1. 代码解剖

    1.1 创建名为HelloWordModule项目

     

    所需要的Jar包为:

     

    1.2 配置Struts2
    在web.xml文件中配置如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
              http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
               version="3.0">
    <display-name>struts2_helloworld</display-name>
        <filter>
            <filter-name>struts2</filter-name>
            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>  
        
        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>
    </web-app>
    

    1.3 创建控制类HelloWorld

    package com.yyq.action;
    import com.opensymphony.xwork2.ActionSupport;
    public class HelloWorld extends ActionSupport {
        private String message;
        @Override
        public String execute() throws Exception {
            message = "Hello World,Struts2";
            return SUCCESS;
        }
        public String getMessage(){
            return message;
        }
    }
    

    1.4 创建index.jsp

    <%@ page contentType="text/html;charset=UTF-8" %>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <html>
      <head>
        <title><s:property value="message"/></title>
      </head>
      <body>
            <s:property value="message"/>
      </body>
    </html>
    

    1.5 配置HelloWorld访问

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
            "http://struts.apache.org/dtds/struts-2.0.dtd">
    <struts>
        <package name="action" namespace="/" extends="struts-default">
            <action name="HWAction" class="com.yyq.action.HelloWorld">
                <result>/index.jsp</result>
            </action>
        </package>
    </struts>
    

    1.6 启动项目并访问

     

    2. 一个简单的用户登录示例

    2.1 创建用户POJO类文件

    package com.yyq.pojo;
    public class User {
        private String userName;
        private String password;
        public User() {
        }
        public String getUserName() {
            return userName;
        }
        public void setUserName(String userName) {
            this.userName = userName;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
    }
    

    2.2 创建Action类文件

    package com.yyq.action;
    import com.opensymphony.xwork2.ActionSupport;
    import com.yyq.pojo.User;
    public class Login extends ActionSupport {
        private User user;
        public User getUser() {
            return user;
        }
        public void setUser(User user) {
            this.user = user;
        }
        //执行登录的方法
        public String execute(){
            return SUCCESS;
        }
    }
    

    2.3 创建登陆页面index.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>登录实例</title>
    </head>
    <body>
    请输入用户名和密码:
    <br/>
    <form action="Login.action" method="post">
        <p>
            用户名:<input type="text" name="user.userName"/>
        </p>
        <p>
            密码:<input type="text" name="user.password"/>
        </p>
        <input type="submit" value="登录"/>
    </form>
    </body>
    </html>
    

    2.4 创建登陆成功页面welcome.jsp

    <%@ taglib prefix="s" uri="/struts-tags" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>登陆成功</title>
    </head>
    <body>
        <p>
            您的用户名为:<s:property value="user.userName"/>
        </p>
        <p>
            您的密码为:<s:property value="user.password"/>
        </p>
    </body>
    </html>
    

    2.5 配置web.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
              http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
               version="3.0">
        <display-name>struts2_helloworld</display-name>
        <filter>
            <filter-name>struts2</filter-name>
            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>
    </web-app>
    

    2.6 配置struts.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
            "http://struts.apache.org/dtds/struts-2.0.dtd">
    <struts>
        <package name="action" namespace="/" extends="struts-default">
            <action name="Login" class="com.yyq.action.Login">
                <result>/welcome.jsp</result>
            </action>
        </package>
    </struts>
    

    2.7 项目结构图

     

    2.8 项目启动与访问

     
     

    三、Struts和Spring MVC对比

    1. 拦截机制的不同

      Struts2是类级别的拦截,每次请求就会创建一个Action,和Spring整合时Struts2的ActionBean注入作用域是原型模式prototype,然后通过setter,getter吧request数据注入到属性。Struts2中,一个Action对应一个request,response上下文,在接收参数时,可以通过属性接收,这说明属性参数是让多个方法共享的。Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了,只能设计为多例。
      SpringMVC是方法级别的拦截,一个方法对应一个Request上下文,所以方法直接基本上是独立的,独享request,response数据。而每个方法同时又何一个url对应,参数的传递是直接注入到方法中的,是方法所独有的。处理结果通过ModeMap返回给框架。在Spring整合时,SpringMVC的Controller Bean默认单例模式Singleton,所以默认对所有的请求,只会创建一个Controller,有应为没有共享的属性,所以是线程安全的,如果要改变默认的作用域,需要添加@Scope注解修改。
      Struts2有自己的拦截Interceptor机制,SpringMVC这是用的是独立的Aop方式,这样导致Struts2的配置文件量还是比SpringMVC大。

    2. 底层框架的不同

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

    3. 性能方面

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

    4. 配置方面

    spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高。

    四、参考文章

      1. https://www.cnblogs.com/yangyquin/p/5434364.html
      2. https://www.cnblogs.com/xu-cceed3w/p/9238137.html
      3. https://www.cnblogs.com/huajiezh/p/6415444.html
  • 相关阅读:
    SciPy
    时间序列
    bytes 与 str 转换
    tensorflow
    Python3+Cuda+Cudnn+GPU
    TensorFlow models
    saltstack
    docker
    分布式文件系统
    创建RHCS集群环境 创建高可用Apache服务
  • 原文地址:https://www.cnblogs.com/WUXIAOCHANG/p/10950504.html
Copyright © 2020-2023  润新知