详解Struts2
来源:互联网 发布:无可奉告知乎 编辑:程序博客网 时间:2024/06/06 09:13
Struts2
在学习Struts2的时候,我认为要知其然,必然要知其所然,在开始阶段,首先想到的是:
1,Struts2是什么样的框架,优点是什么?
2,Struts2原理是什么?
3,Struts2在我们开发程序的时候,能够做些什么来帮助我们减少程序开发?
4,我们在用Struts2的时候,会遇到什么问题,遇到问题了,该怎么去解决?
下面让我一一为大家道来.........
Struts2框架,它是Struts1和Webwork合并而来的,其实webwork占了主要地位,Struts2是基于filter的,action是原型的,它不像struts1那样什么都交给ActionSerlvet来做,在并发访问的时候,struts1就会产生线程安全问题,而Struts2就不会,为什么呢,因为每次新的请求,都会产生新的action与当前线程绑定,各个并发访问互不干涉,Struts2有如下几个优点:
a:seperate aware:分离关注,解耦
b:action是原型的,耦合性低,(pojo)
c:action不需要和原生的ServletAPI耦合在一起,在junit测试的时候,更加容易,不要部署到web服务器就可以进行。
d:strtus2对任务进行了拆解,也就是采用了分离关注的特点,是更加整洁的mvc框架。
在说Struts2原理的时候,要首先明白什么是ActionContext?什么是ValueStack,他们是什么?
ActionContext是Struts2的数据控制中心,是ThreadLocal线程本地化的,其实,我们在看源码的时候就知道了,它不过是map的map,为什么这么说呢?ActionContext是到各个域的引用,request,session,apllcation,
valuestack,attr,params,(在这里有人就提出疑问了,什么是valuestack),其实它不过是request里面的一个属性,那么为什么要有valuestack呢,这里其实是为了方便数据的取用,大家都往值栈里面放数据,那时候就直接可以取出了,没有必要获取request了,然后获取其数据。看看这个reqeust.setAttribute("struts.ValueStack",list);
现在,就可以来说一下struts2的工作原理了,sturts是基于filter的,用下图表示
其实现在struts2是用StrutsPrepareAndExecuteFilter过滤器
恩,接着,我来来说说其细节,当过来请求的时候,经过PrepareOperation预处理,在看源码的时候,预处理会做以下操作@··createActionContext(也是上面我们说到数据中心,map的map)@··findActionMapping(是交给actionMapper来做的).预处理就告一段落。紧接着,就执行处理,ExecuteOperation.到了ConfigurationManager,加载struts.xml配置文件,找到ActionProxy代理,然后找到中间人ActionInvocation,中间人递归调用inerceptor,一般在配置文件用到了默认的拦截器struts-default,18个拦截器,(预处理-Action-后处理)。其实自己跟着代码走一下, 其中struts2的原理不是很难的。
既然知道了struts2是什么,原理什么,那是不是该爽一下了,好吧,来下helloworld,哈哈
第一步:创建web项目
第二步:引入struts2类库
第三步:创建action
/**HelloWorldAction*/
public class HelloWorldAction{
public String execute(){
System.out.println("HelloWorld");
return null;
}
}
第四步:配置struts.xml
...
<struts>
<package name="HelloWorldPak" namespace="/helloworld">
<action name="HelloWorldAction" class="....HelloWorldAction">
</action>
</package>
</struts>
第五步:配置过滤器到web.xml中
<filter>
<filter-name>action</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</fiter-class>
<fiter-mapping>
<filter-name>action</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</filter>
这样是不是爽了一把了啊,如果你只输出一个helloworld就用struts2是不是太大材小用了啊,O(∩_∩)O哈哈~
我们用struts2可以做什么呢?
1,struts2验证
拦截器 valiation
action继承actionsupport
声明式,硬编码式
2,防止表单的重复提交
拦截器 Token
令牌处理的原理
3,自定义拦截器
继承interceptor
4,参数的传递
5,文件的上传
拦截器:fileUpload
private File photo;
pirvate String photoFileName;
private String photoContentype;
struts2所干什么,在项目中明确可以体现,做完一个完整的项目后,会更加熟练掌握struts2的。
啊啊啊,我忘记了很重要一点。ognl表达式,标签哦,下面把用法列出来。
<s:property value="#request.username" /> <br/><s:property vlaue="#seesion.username" /> <br /><s:property value="applicaion.username" /> <br /><s:property value="attr.username" /> <br/><s:prperty value="username" /><br /><s:textfield name="#session.username" lable="%{#request.username}" />
<s:property value ="'<hr> tom'" escope="false"/><s:set var="applicaionmyname" value="#session.username" /><s:property value="applicationmyname" /><s:push value="#application.username"> <s:property/></s:push><s:bean name="cn.hhxy.struts2.model.User" var="mybean"> <s:param name="name" value="#request.username" /> <s:property value="name" /></s:bean><s:property value="#mybean.name"/><s:action name="RegAction_toRegView" namespace="/regns" executeResult="true" />
<s:iterator value="userList" var="u" status="st"> <tr class='<s:property value="#st.even?'even':'old'">' <td><s:property value="#st.count" /></td> <td><s:property value="#st.index" /></td> <td><s:property value="#u.name" /></td> <td><s:property value="#u.age" /></td> </tr></s:iterator><s:iterator value="userList" var="u" status="st"> <tr class='<s:property value="#st.even?'even':'old'">' <td><s:property value="#st.count" /></td> <td><s:property value="#st.index" /></td> <td><s:property value="#u.name" /></td> <td><s:property value="#u.age" /></td> </tr><s:if test="#u.age <23" >少年</s:if><s:elseif test="u.age" >27>老年</s:elseif><s:else>中年 </s:else><s:url action="userAction_edit" namespace="/user" var="editUrl" > <s:param name="id" value="#u.id" /> <s:param name="name" value="#u.name" /></s:url> <a href='<s:property value="#editUrl" />' >编译</a></s:iterator>
<s:iterator value="{100:'tom',200:'sdaf',300:'adf'}"> key=<s:property value="key" />; value=<s:property value="value" /></s:iterator>
<s:iterator value="userList.{?#this.age>25}"> <s:property /><br /></s:iterator>
<s:iterator value="userList.{name}" > <s:property /><br /></s:iterator>
<s:property value="sayHello(#session.username)" /><s:property value="@。。.HelloWorldAction@sayStaticHello(#session.username)" /><s:form theme="xhtml"> <s:textfield name="username" label="Username" /></s:form><s:textfield name="usernmae" key="label.name.global" theme="xhtml" value='%{username}' /><s:checkbox name="married" label="婚否" />
<s:form namespace="/ui" action="UiAction_reg" method="post" theme="xhtml"> <s:checkbox name="married" lable="婚否" /> <s:select list="#{101:'tom',202:'jerry',303:'kingkong'}" label="username" listKey="key" listValue="value" /> <s:radio name="sex" list="#{0:'男',1:'女'}" label="性别" /> <s:checkboxlist name="hobby" list="#{0:'足球',1:'篮球',2:'乒乓球'}" label="爱好" /> <s:doublselect name="selectProvinceid" list="provinces" listKey="id" listValue="areaName" doublename="selectedCityId" doubleList="cities" doubleListKey="id" doubleListValue="areaName" label="区域" /></s:form>
好吧,以后在详解项目中,在来深入,全面的说一下struts2吧。
- struts2详解
- 详解Struts2
- 详解Struts2
- struts2详解
- Struts2 详解
- Struts2详解
- struts2详解
- struts2详解
- Struts2详解
- struts2详解
- struts2详解
- Struts2 详解
- Struts2概述-2.Struts2详解
- Struts2深入详解--- 认识Struts2
- Struts2 属性详解
- Struts2 配置文件详解
- struts2配置文件详解
- struts2标签详解
- 改善C++ 程序的150个建议学习之建议27:区分内存分配的方式
- 如何在Solaris10下修改IP地址
- VC++中CMAP用法
- 黑马程序员--面向对象(封装)
- android启动过程分析--启动init进程
- 详解Struts2
- tld
- linux下使用socket实现组播
- 如何模拟苹果官网高端大气上档次的产品视频演示
- android是如何加载资源图片的
- android启动过程分析--启动zygote
- mkisofs
- java 生产者与消费者进阶
- 提高你的Java代码质量吧:使用valueof前必须进行校验