详解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吧。

</s:iterator>