struts1.x 和 struts2.x向Action里填充jsp参数原理

[align=center][size=x-large][b][color=red]struts1.x 和 struts2.x向Action里填充jsp参数原理[/color][/b][/size][/align]


[size=medium][b][color=green]一、struts1.x原理:[/color][/b][/size]
[img]http://dl.iteye.com/upload/picture/pic/119420/ec58943b-53bc-393c-a97a-c756fa651df0.jpg[/img]
[img]http://dl.iteye.com/upload/picture/pic/119422/4d3d6ff6-9d54-3048-a0e1-99696ebc2287.jpg[/img]

由上图可以看出,struts1.x是基于单例模式,所有XXaction.do都是在ActionServlet这个实例进行控制,最后实际的Action处理类是Struts应用中真正干活的组件,它解决的是做什么的问题,它通过调用需要的业务组件(模型)来完成应用的业务,业务组件解决的是如何做的问题,并将执行的结果返回一个代表所需的描绘响应的JSP(或Action)的ActionForward对象给ActionServlet以将响应呈现给客户。当同时有多人访问同一action时,此时线程是不安全的!
struts2.x则不一样,每个XXaction.action会调用各自的action实例并自己控制跳转,而不会像struts1.x将结果(jsp或另一个action)返回给actionServlet,所以相互不影响,所有是线程安全的!


1.启动Tomcat服务器,加载web.xml --> 加载struts-config.xml
实例化所有的XXaction、beanForm、result、jsp放入内存中。
[b][color=green] key -----> value
XXaction beanform/result/jsp[/color][/b]
2.用户请求url: http://IP:port/context/*.do
(1)url中*.do经过拦截:
由ActionServlet拦截处理(核心)--->去内存中通过key去寻找value(beanform),检索和用户请求匹配的ActionMapping实例,如果不存在与之对应的Action(可能是jsp/html请求)就返回请求路径无效信息,如果存在,则进入下一步。
(2)将参数填充到beanForm里面去:
如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中;
(3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法;
(4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActuibErrors对象, 就表示表单验证成功;
(5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法; (6)Action的execute()方法:
action对象调用Service.save(beanform)--->DAO---->DB --->
返回到Action类的list<User> users = UserService.findAll(); --->
再通过request.setAttributes("users",users) ;
返回给ActionServlet一个ActionForward对象,ActionServlet在把客户请求转发给 ActionForward对象指向的JSP组件;
(7)ActionForward对象指向JSP组件生成动态网页,返回给客户;
(8)用户:在Jsp页面通过
<% List<User> list = request.getAttributes("users") ; %>



1.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>
</servlet>

<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

<taglib>
<taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
</taglib>


2.struts-cofig.xml文件
主要配置:
data-sources
global-execptions
form-beans
global-forwards
action-mappings
controller
message-resources
plug-in

<!-- Action配置
Path:在浏览器的URL中输入的字符(必须的)
Type:连结到本映射的Action的全称(可选的)
Name:与本操作关联的Action Bean在<form-bean/>中定义name名(可选的)
Scope:指定ActionForm Bean的作用域(session和request),缺省为session。(可选的)
Input:当Bean发生t误时返回的控制。(可选的)
ClassName:指定一个调用这个Action类的ActionMapping类的全名。缺省用
org.apache.struts.action.ActionMapping,(可选的)
Forward:指定处理相应请求所对应的JSP页面。(可选的)
Include:如果没有forward的时候,它起forward的作用。(可选的)
Validate :若为true,则会调用ActionForm的validate()方法,否则不调用,缺省为true。(可选的)
-->
<form-beans>
<form-bean name="LoginForm" type="com.lenovo.loginForm" />
</form-beans>

<action-mappings>
<action path="/login"
type="mail.login.LoginAction"
name="LoginForm"
scope="request"
validate="true">
<forward name="success" path="/index.jsp"></forward>
<forward name="error" path="/Error.jsp"></forward>
<forward name="input" path="/login.jsp"></forward>
</action>
</action-mappings>

参考:[url]http://hi.baidu.com/mnlnzecvwcimosr/item/f7b7b23eec2571fd97f88d15[/url]
[url]http://blog.sina.com.cn/s/blog_4bd19a250100ttpl.html[/url]


[size=medium][color=green][b]二、struts2.x原理[/b][/color][/size]

1.启动Tomcat服务器,加载web.xml --->
加载spring配置文件,applicationContext.xml ---> 把DBResource(Hibernate.cfg.xml)、sessionFactory、HibernateTemplate(Daoimpl)、Service --->
加载struts.xml ---> 将Action加载到内存中
[b][color=green] key -----> value
XXaction result/jsp[/color][/b]
但是参数不像struts1.x一样,通过key映射beanForm,而是在struts2.x的Action类构造函数(参数1,实体2,实体3,.....),这些参数、bean实体有set get方法。

2.用户请求url: http://IP:port/context/*.action
url中*.action经过拦截:web.xml的FilterDispatcher拦截过滤,通过struts.xml匹配相应的action,当
访问的参数 <input type="text" name="code"/>
或bean实体 <input type="text" name="admin.name"/>
<input type="text" name="admin.password"/>
有相应的set()方法,就把jsp里面的参数填充到Action对象的属性里面去
----> action对象调用Service.save(beanform)--->DAO---->DB --->
返回到Action类的list<User> users = UserService.findAll(); --->
users有getUsers()方法时,就把users保存在一次服务器跳转中request--->
在jsp页面通过<s:iterator value="users"></s:iterator>循环输出
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值