首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

struts1.x、struts2.x跟springmvc浅析(转载)

2012-11-03 
struts1.x、struts2.x和springmvc浅析(转载)入住javaeye也要1年半了,第一次给自己的blog丰富点. 从当前java

struts1.x、struts2.x和springmvc浅析(转载)

入住javaeye也要1年半了,第一次给自己的blog丰富点. 从当前javaEE项目来说,有关view层的框架做个小总结.
一: struts1.x
A配置:
1 导入struts1.x的jar包到web-inf/lib下面
2 在web-inf目录下新建struts-config.xml文件,配置struts相关内容
3 web.xml配置加入:
<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中的匹配 ,决定返回呈现的页面

B流程:
1预备工作:服务器启动,Web应用启动时就会加载web.xml初始化actionServlet和记载struts配置文件(struts-config.xml),读配置信息到内存中,供以后action调用
2(由请求定位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.
3(页面数据注入)
找到对应的action之后,ActionServlet会把表单提交的数据给存放(生成对应调用set/get方法)到struts-config中相应的action标签的name属性值指定的actionform类中(若有,[actionform的子类,并且在form-bean标签中配置了,若要进行数据验证可以在actionform中覆盖validate方法,推荐使用js,减轻服务器负担]).同时把actionform和当前HttpServletrequest 对象注入到代调用的action方法中.
4(调用action的处理方法)
[默认是execute方法可以通过dispactureAction分发请求给自定义的方法]可以在方法中取得请求附属的数据(若需要),编写业务逻辑代码处理请求.
5(返回到view层的页面)
? Action的业务逻辑方法会返回一个ActionForward对象 ,ActionForward对象根据此action配置的<forward>匹配name进而调转到对应path的jsp页面上.
C特性分析:
1 线程模式:单例模式,每个action只维护一个实例服务于对应的请求,效率较好,但多线程环境下需要考虑数据同步等安全问题
2 JSTL标签和struts标签处理页面展示,页面相对整洁

二:struts2.x
A配置:
1 导入struts2.x的相关jar包到WEB-INF/lib下
2 在项目的src目录下新建struts.properties或struts.xml
struts.properties和struts.xml具有相同的配置作用,配置项目相关
3 web.xml加入:
??? <!-- 延长action中属性的生命周期,以便在 jsp页面中进行访问,让actionContextcleanup过滤器来清除属性,不让action自己清除。-->
??? <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:
------页面
#? <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" action="Kinder_add.php"
? <input type="text" name="kinder.name">
? <input? type="text"name="kinder.zip">
? <input type="submit" value="提交">
</form>
-----strust.xml
- <action name="*_*" method="{2}" />
这样就会自动扫描controller包下面的所有类

<!--:对模型视图名称的解析,即在模型视图名称添加前后缀? -->
<bean 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验证

B流程:
spring mvc请所有的请求都提交给在web.xml中配置的DispatcherServlet,由它查询一个或多个HandlerMapping,找到处理请求的Controller,并且将请求提交给这个类。
Controller进行业务逻辑处理后,会返回一个ModelAndView
Dispathcher查询一个或多个 ViewResolver视图解析器,找到ModelAndView对象指定的视图对象 ,视图对象负责渲染返回给客户端。
C 特性:
1 线程模式:单例模式,效率较好.
2 基于方法级别的拦截,而不是基于类。更细粒度的灵活控制
3 通过注解简化了很多配置,但同时在代码中增加了和业务不相干的代码.
[并不是所有项目都适合通过注解,虽然可以简化繁琐的配置,但是对于项目经常需要改动时,有可能需要更改代码并重新编译后才能使之生效,而配置文件的更改可以自动服务器发现,及时更新]

总结:
这里可看出这几个框架大致有哪些异同,可以根据项目来适当选择.个人感觉springmvc 这的不错,struts2 回归从单例模式回归.每次都是新的实例.+ 项目拦截器存在过多等问题,感觉效率不是很好. springmvc 则提供的最简化的请求处理映射,能极大提高项目效率.
【曾看到过一个做测试的哥们说,做并发压力测试,struts2每秒到达300左右,springmvc到达了2000/s.】

总之.根据项目而选择所需要架构.
下次有机会把我springmvc(注解) + spring +hibernate小demo分享下,希望有经验的拍砖并指点下. over。

文章出处:飞诺网(www.diybl.com):http://www.diybl.com/course/3_program/java/javajs/20100719/459152.html

热点排行