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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章