详解Struts2

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.itcast.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: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:url includeParams="all" var="myurl" />
<s:property value="myurl"/>


<s:i18n name="cn.itcast.struts2.action.RegAction_zh">
<s:text name="label.age" var="mytext"/>
</s:i18n>
<s:property value="mytext" />


<s:property value="userList.size" />
<s:property value="userList.isEmpty" />


<s:iterator value="{'sdf1','sdf2','sdf3','sfd4'}">
<s:property /><br />
</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吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值