【Struts2一】入门

来源:互联网 发布:哔哩哔哩for mac 编辑:程序博客网 时间:2024/06/03 22:51
Struts2是一个MVC框架!
框架的作用是让我们操作更爽!更优雅!
比如更加优雅的url配置,更简洁的获取表单数据,更爽快的方法级别的细粒度控制。。。。

一。Struts2工程步骤:
1.建立一个web工程,取名mystruts2,在web.xml中配置过滤器:
  <filter >
    <filter-name >struts2 </filter-name>
    <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class>
  </filter >
  <filter-mapping >
    <filter-name >struts2 </filter-name>
    <url-pattern >/* </url-pattern>
  </filter-mapping >

2.导入相关包


3.源码根目录下的struts.xml:
    解决struts.xml没有提示:
    preference->搜索xml-> xml Catalog ->add  选择dtd文件的位置,key值为从xml文件copy!

<?xml version= "1.0" encoding ="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
     <package name="user" namespace="/" extends="struts-default" >
           <action name= "userAction" method ="add"
               class= "com.oterman.struts.bean.UserAction" >
               <result name= "index">index.jsp </result>
           </action>

     </package >
     
</struts>


4.新建一个action:UserAction,该action就是上面配置的action,里面有一个add方法,返回"index"
5.访问:localhost/mystruts2/userAction.action,既可以看到jsp页面!


extends 机制
<package name="user" namespace="/aa" extends="struts-default">
     <action name="userAction" method="add"    class="cn.itheima03.struts2.action.UserAction">
          <result name="index">index.jsp</result>
     </action>
</package>
<package name="aa" namespace="/bb" extends="user"></package>

说明:
   1、struts2配置文件中的包具有继承机制
   2、name为aa的包已经把name为user的包的所有的内容继承过来了
   3、访问命名空间为bb的userAction也行
   4、因为在struts-default.xml文件中拥有struts2运行时的所有的内容,所以必须继承过来才能使用struts2
   5、所以一个配置文件中的package必须继承struts-default.xml文件
   6、在struts-default.xml文件中,定义了一些结果集,这些结果集是struts2运行的关键
         <result-types>
            <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
            <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
            <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
            <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
            <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
            <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
            <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
            <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
            <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
            <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
        </result-types>

如果namespace配置为/aa,那么/aa/uaseAction.action能正常访问action,但是结果集访问不到,需要将结果集放于webroot/aa/index.jsp;
/aa/bb/userAction.action,能访问到action,因为本级查找不到会往上一级查找,但是最多查找到/aa这一级!


action 的三种写法:
   1、简单的一个javabean
   2、让一个action 实现接口Action
       public class ExecutionAction implements Action{
               execute(){

               }
       }
      在配置文件中
         <action name="executeAction"  class="cn.itheima03.struts2.action.ExecuteAction">
       这里不需要写method属性,默认执行execute方法
   3、让一个action类继承actionSupport
       public class ActionSupport implements Action, Validateable, ValidationAware
    说明:在ActionSupport类中做了很多的操作,比如:验证器、国际化等。程序员只要重写execute方法即可
   4、在struts的配置文件中,在写action元素的时候,可以不写class属性
         <action name="defaultAction">
                  <result name="success">index.jsp</result>
         </action>
       根据struts-default.xml
            <default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
       如果没有class属性,则struts2会去查找ActionSupport



二。配置文件中的通配符:
有了通配符,对于url的操作更加的优雅了 !通配符解决的就是url与action中的方法的映射问题!

<struts>
     <package name="pattern1" namespace="/" extends="struts-default" >
     
           <action name= "a_add" method ="add"
                class= "com.oterman.struts.action.PatternAction" >
               <result >index.jsp </result>
           </action>
           <action name= "b_add" method ="add"
                class= "com.oterman.struts.action.PatternAction" >
               <result >index.jsp </result>
           </action>
           <action name= "c_add"
                class= "com.oterman.struts.action.PatternAction" >
               <result >index.jsp </result>
           </action>
     </package >
     
</struts>



如上所示:为了实现多个地址访问同一个方法,可以使用通配符:
 <action name= "*_add" method ="add"
   class= "com.oterman.struts.action.PatternAction" >
      <result >index.jsp </result>
</action>



浏览器访问时,可以通过url来指定要访问的方法:a_add!add.action,  感叹号后面表示要访问的方法!

通配符二:
     <package name="pattern2" namespace="/" extends="struts-default" >
           <!--
          <action name="personAction" method="add"
               class="com.oterman.struts.action.PersonAction">
              <result >index.jsp</result>
          </action>
          <action name="studentAction" method="add"
               class="com.oterman.struts.action.StudentAction">
              <result >index.jsp</result>
          </action>
          -->
           <action name= "*" method ="add"
               class= "com.oterman.struts.action.{1}" >
               <result >index.jsp </result>
           </action>
     </package >


通配符三:
TeacherAction中有add ,delete ,update方法
           <action name= "teacherAction" class="com.oterman.struts.action.TeacherAction" >
               <result >index.jsp </result>
           </action>

采用如上配置,不指定method属性,在url中指定要访问的方法!
http://localhost/mystruts2/teacherAction!delete.action访问delete方法;(.action可以不要!!!)

通配符映射
   在struts2的配置文件中可以使用通配符映射
     <action name="personAction_*">
          其中的*可以代表任意字符
          *可以和{1}匹配  
          {1}可以出现在method、class、result中
                method={1}
                class="……{1}"
                <result>………{1}.jsp</result>
     <action name="*_*">这个是一个变态的写法,效率比较低,而且很容器和其他的url产生冲突


说明:通常的写法有两种
      1、<action name="userAction_*" method="{1}" class=".....UserAction">
             要写具体的类,方法可以用*来代替
      2、方法的动态调用来做


三.拦截器
   1、如果有一个比较复杂的逻辑,在没有拦截器的情况下,会把这些需求全部写在action的方法中
      这样会导致方法的结构不好
   2、会把一些重用性的内容写在拦截器中
   3、要把这些重用性比较高的代码以很好的组织形式结合起来,一个拦截器是不够的,所以需要
      拦截器栈
   4、怎么样写一个拦截器
        1、声明一个拦截器
             <interceptors>
                  声明了一个拦截器
                 <interceptor name="imageInterceptor" class="cn.itheima03.struts2.interceptor.MyInterceptor"></interceptor>
                  声明了一个拦截器栈:可以放很多个拦截器
                 <interceptor-stack name="myInterceptor">
                         <interceptor-ref name="imageInterceptor"></interceptor-ref>
                          为struts2默认执行的拦截器
                          interceptor-ref即能指向拦截器,也能指向拦截器栈
                         <interceptor-ref name="defaultStack"></interceptor-ref>
                 </interceptor-stack>
             </interceptors>

        2、使用拦截器
           
    <default-interceptor-ref name="myInterceptor"></default-interceptor-ref>

            这样就可以覆盖struts-default.xml文件的内容了
        3、写的拦截器类必须实现Interceptor接口
               intercept(){
                    return invocation.invoke();//往下继续执行
               }

0 0