Struts和Spring MVC的比较(非原创)
文章大纲
一、spring mvc项目例子
二、struts项目例子
三、struts和spring mvc对比
四、参考文章
一、spring mvc项目例子
二、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高。
四、参考文章
下一篇: 请问我怎么推广自己的网站?