(出处: http://blog.csdn.net/qiulongtianshi/article/details/7776694 )
引言
前面我们详细介绍了Spring MVC(轻松上手SpringMVC),那我们是否应该反问自己我们常用的轻量级WEB框架Struts1,Struts2和Spring MVC有什么区别?我们什么时候用?各个框架之间有什么好处?我想大家都想研究一下这个问题吧,那就下面由我拉开PK大幕:
第一项:各个框架简介
第二项:重点框架PK
一:Struts1.x
第一:配置
<servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>3</param-value> </init-param> <init-param> <param-name>detail</param-name> <param-value>3</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
配置随容器启动的servlet,并初始化struts的配置文件.设置由struts处理的请求标识
4. 编写action控制类,继承Action[复杂情况继承DispactureAction],同时在struts-config.xml中配置这个控制类action.例如
<action path="/stock" parameter="method" name="stocklogForm" type="com.xuanmu.struts.action.stock.StockAction" scope="request"> <forward name="LIST" path="/productsList.jsp" /> </action>
当截取到请求为stock时就由StockAaction处理.[继承DispactureAction的话分发到parameter值对应的方法中去], 该方法返回由字符串封装[LIST]的ActionForward对象,然后再struts-config.xml中的匹配 ,决定返回呈现的页面
第二:流程:
(由请求定位action控制类)
用户通过客户端向服务器发出一个请求,http://localhost:8080/struts_login/login.do,我们已经在web.xml配置了所有符合某特定格式的请求都将由struts指定的Servlet来处理。比如:只要是以.do结尾的请求(*.do)都由 org.apache.struts.action.ActionServlet来对其进行处理.ActionServlet会拿到用户的请求,并且去分析这个URL,它会截下 /login. 截下来之后,它是为了去struts-config.xml这个配置文件里面找<action>标签path属性的值等于所截部分的那个 Action.
(页面数据注入)
找到对应的action之后,ActionServlet会把表单提交的数据给存放(生成对应调用 set/get方法)到struts-config中相应的action标签的name属性值指定的actionform类中(若有, [actionform的子类,并且在form-bean标签中配置了,若要进行数据验证可以在actionform中覆盖validate方法,推荐使用js,减轻服务器负担]).同时把actionform和当前HttpServletrequest 对象注入到代调用的action方法中.
(调用action的处理方法)
[默认是execute方法可以通过dispactureAction分发请求给自定义的方法]可以在方法中取得请求附属的数据(若需要),编写业务逻辑代码处理请求.
(返回到view层的页面)
Action的业务逻辑方法会返回一个ActionForward对象 ,ActionForward对象根据此action配置的<forward>匹配name进而调转到对应path的jsp页面上.
第三:特性分析
二:Struts 2.x
第一:配置
<filter> <filter-name>ActionContextCleanUp</filter-name> <filter-class>com.opensymphony.webwork.dispatcher.ActionContextCleanUp</filter-class> </filter> <!-- 若有其他相关的filter 需要加在这个地方--> <!--配置struts2过滤器--> <filter> <filter-name>webwork</filter-name> <filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>ActionContextCleanUp</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>webwork</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
4. 编写action请求处理类.可以继承struts2的 ActionSupport也可以不继承,(不过一般为了方便获取 request,response以及session 最好自己编写一个类继承ActionSupport,并在类中获取request等,让请求处理类继承这个类),然后根据页面和struts.xml配置决定请求的处理方法
示例1:
页面1:
<s:form action="login.action" method="post"> <s:textfield key="username" name="user.username"/> <s:password key="password" name="user.password" /> <s:submit key="submit" /> </s:form>
struts.xml
<action name="login" class="cc.dynasoft.action.LoginAction"> <result name="success">/welcome.jspresult> <result name="error">/login.jspresult> </action>
这时请求会交由LoginAction的默认方法execute来处理,在LoginAaction中有user对象及其set方法,页面属性会自动注入到此user对象中,返回字符串[success],匹配struts.xml此action内的result值确定调转的展示页面.
示例2:
页面2:
<s:form action="submit.action"> <s:textfield name="msg"label="输入内容"/> <s:submit name="save"value="保存"align="left"method="save"/> <s:submit name="print"value="打印"align="left"method="print"/> </s:form>
struts.xml
<action name="submit" class="action.MoreSubmitAction"> <result name="save">/result.jsp</result> <result name="print">/result.jsp</result> </action>
由页面submit的method方法来指定对应的处理方法,方法返回字符串.继而确定调转展示页面
示例3:
设置自定义的url后缀,有struts2处理例如struts.action.extension=php.默认为action,即处理所有*.action的请求
页面3:
<form method="post" action="Kinder_add.php" <input type="text" name="kinder.name"> <input type="text"name="kinder.zip"> <input type="submit" value="提交"> </form>
struts.xml
<action name="*_*" method="{2}" class="ostar.lg.action.{1}Action"> <result name="success">/default.jsp</result> </action>
这样的意思是:所有由'_'间隔的请求都会有'_'前面的字符串同名的action类处理,并交给这个类的和'_'后面字符串同名的方法处理[简化了配置],方法返回字符串继而确定调转展示的页面.(*_*只是一种自定义格式,可任意配置)
第二:流程:
第三:特性分析
三:Spring MVC
第一:配置
<!-- Spring 容器启动监听器 --> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener、 </listener-class> </listener> <!-- Spring MVC 的 Servlet ,它将加载 WEB-INF/annomvc-servlet.xml 的配置文件,以启动 Spring MVC 模块 --> <servlet> <servlet-name>annomvc</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>annomvc</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
[这里spring回根据servlet-name的值(annomvc)去加载(annomvc).servlet.xml]
注解1:
在web-inf/新建annomvc-servlet.xml里面新增如下:
<!--:对 web 包中的所有类进行扫描,以完成 Bean 创建和自动依赖注入的功能 -->
<context:component-scan base-package="com.controller" />
这样就会自动扫描controller包下面的所有类
<!--:对模型视图名称的解析,即在模型视图名称添加前后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/test/" p:suffix=".jsp" />
3. 这样你在com.controller下面新建一类Test类
@Controller @RequestMapping("/test.do") public class Test{ @RequestMapping(params="method=show") public String show(User user,ModelMap model){ System.out.println(“calling...”); } }
这样当页面有请求,例如action="test.do?method=show"时就会调用Test类中的show方法. 是不是简化了很多..
注意:需要使用spring注解时还需要在配置文件中加上相应的xml的schema验证
第二:流程:
第三:特性分析