zoukankan      html  css  js  c++  java
  • Struts2 Action

    1.namespace:表示包所在的空间,访问包的action路径是 http://localhost:8080/项目名/namespace/index.action
            namespace 也可以不写,
            假如访问的路径是 http://localhost:8080/aaa/bbb/index.action,
            在struts.xml中没有找到aaa和bbb的包空间
            只要找到一个index.action而没有找到和他精确对应的package是,就叫个namespace为空的package处理
            所以说namespace为空的package囊括了其他package处理不了的action
      

        <package name="front" namespace="/front" extends="struts-default">
            <action name="index">
                <result name="success">/hello.jsp</result>
            </action>        
        </package>
        <package name="front2" extends="struts-default">
            <action name="index">
                <result name="success">/hello.jsp</result>
            </action>        
        </package>




    2.action:  

      <package name="front3" extends="struts-default">
            <action name="index" class="xxx.xxx.xx.FirstAction">
                <result name="success">/hello.jsp</result>
            </action>        
        </package>

        实现action的3种方式
        a.

     public class FirstAction {
        public String execute(){
            return "success";
        }
     }
    所有的方法都要自己去写。语法上不好控制
     

        b.

      public class FirstAction implements Action{
            public String execute(){
                return "success";
            }    
       }
        Action 接口里面只有一个execute()抽象方法

        c.

      public class FirstAction extends ActionSupport{
            public String execute() throws Exception {
                return "success";
            }
        }
        使用第三种,因为ActionSupport已经封装了一些可供直接调用非常方便的方法
        在子类里面可以直接调用



    3.动态的方法调用(DMI)
        调用UserAction里面的add()方法的url地址为:
        http://localhost:8080/项目名/namespace/user!add.action

    <package name="user" namespace="/user" extends="struts-default" >
            <action name="user" class="com.zr.struts.user.action.UserAction">
                <result>/user_add_success.jsp</result>
            </action>
    </package>


    4.通配符的配置:可以将配置量降到最低
        调用UserAction里面的add()方法的url地址为:
        http://localhost:8080/项目名/namespace/useradd.action
      

     <package name="user" namespace="/user" extends="struts-default" >
            <action name="user*" class="com.zr.struts.user.action.UserAction" method="{1}">
                <result>/user_{1}_success.jsp</result>
            </action>
     </package>



        调用UserAction里面的add()方法的url地址为:
        http://localhost:8080/项目名/namespace/User_add.action (User得大写如果是小写的话找的就是userAction)
        相当于调用UserAction 里面的 add()方法 返回到User_add_success.jsp页面
      

     <package name="User" namespace="/user" extends="struts-default" >
            <action name="*_*" class="com.zr.struts.user.action.{1}Action" method="{2}">
                <result>/{1}_{2}_success.jsp</result>
            </action>
     </package>


    5.action的属性来接受参数

     <package name="user" namespace="/user" extends="struts-default" >
            <action name="user" class="com.zr.struts.user.action.UserAction">
                <result>/user_add_success.jsp</result>
            </action>
     </package>

        a.方式1:
            http://localhost:8080/项目名/namespace/user!add?name=xxx&age=XXX.action
            在UserAction里面定义两个属性:
            private Sring name;  private int age; 提供get/set方法
            这样访问这个Action时会自动调用get/set方法来接收name 和 age这两个参数
        b.方式2:
            http://localhost:8080/项目名/namespace/user!add?user.name=xxx&user.age=XXX.action
            使用Model模型来接受参数    
            在UserAction里面定义一个属性:private User user;
            modle User 中有两个属性:private Sring name;  private int age; 并提供get/set方法
            UserAction里面有提供getUser/setUser 方法
        c.方式3:
            http://localhost:8080/项目名/namespace/user!add?name=xxx&age=XXX.action
            UserAction实现了一个ModelDriver<T>接口

        public class UserAction extends ActionSupport implements ModelDriver<User>{
                private User user;
    
                @Override
                public User getModel(){
                   return user;
                }
          }       
       struts2会自动调用 getModle()并将参数name和age传递给user;


    6.struts2的编码问题:

        只需要在struts.xml中配置<constant name="struts.i18n.encoding" value="UTF-8"/>

    不用配置 ,因为他的默认值就是utf—8

    7.SimpleDateValidates
        http://localhost:8080/项目名/namespace/user!add?name=xxx.action
      

     public class UserAction extends ActionSupport{
            pirvate String name;
    
            public String add(){
               if(name == xxx){
                this.addFieldError("name","name is error")         
               }
           return "error"; }
    public String getName(){return name;} public void setName(String name){this.name = name;} }


        在jsp文件中显示错误信息:
        1.使用struts2的标签:
            <s:fielderror fieldName="name"/>这种方法显示的错误信息会自动的添加CSS格式(<li>)
                    
        2.从value Stack中取出错误信息(errors或者FieldErrors都可以)
            <s:property value="errors.name" /> (errors: {name=[name is error]})
            (errors是Value Stack中的一个属性是一个Map<key,value>,其中的value是一个数组)
            <s:property>标签专门取Value Stack和Stack Context中的属性
            <s:debug>标签(页面会出现一个名为debug的链接)可以查看Value Stack中的属性
            
    8.struts2访问web元素(获取Map类型request,session,application
                真实类型HttpServletRequest,HttpSession,ServletContext的引用)
        方式1:(依赖web容器)
        

       public class LoginAction extends ActionSupport {
    
                private Map<String, Object> request;
                private Map<String, Object> session;
                private Map<String, Object> application;
                public LoginAction(){
                    request = (Map)ActionContext.getContext().get("request");
                    session = ActionContext.getContext().getSession();
                    application = ActionContext.getContext().getApplication();
                }
                
                public String execute(){
                    request.put("a", "aa");
                    session.put("b", "bb");
                    application.put("c", "cc");
                    return "success";
                }
       }



            在jsp页面可以用以下方式取出:
            (存放在Stack Context里面,需要加#才能取出来,详情用<s:debug>标签查看)
            方式1:
              

            <s:property value="#request.a" />
                <s:property value="#session.b" />
                <s:property value="#application.c" />


            方式2:(说明struts一定是在三个Map类型和3个真实类型之间建立了某种关系,并且把Map中的值复制进去)
              

             <%=request.getAttribute("a") %>
                <%=session.getAttribute("b") %>
                <%=application.getAttribute("c") %>


            方式3:(attr会自动的寻找属性名a,b,c所对应的值,前提是属性名不能重复)
             

      <s:property value="#attr.a" />
      <s:property value="#attr.b" />
       <s:property value="#attr.c" />


        
        方式2:(最常用)实现RequestAware,SessionAware,ApplicationAware 三个接口
            (依赖web容器,体现了IOC inverse of control 控制反转)
            方式一:的3个Map是由自己初始化的,现在是依赖外部的注入(DI dependency injection依赖注入)
            过程:struts2接受到一个请求,首先会new一个对应的Action,然后判断这个Action是否实现了
                  上面的3个接口,如果实现了接口,struts2调用对应的set方法,用自己得到的3个Map
                  初始化Action的3个Map;(即struts2初始化了这3个Map充分体现了控制反转)
            
            补充:request很少会去取他,因为Action里面的成员变量(存放在Stack Value)会起到request的作用
                  application也很少用, 如果定义全局的内容一般放在数据库或者定义一个类
         

      public class UserAction extends ActionSupport implements RequestAware,SessionAware,ApplicationAware {
                private Map<String, Object> request;
                private Map<String, Object> session;
                private Map<String, Object> application;
                
                public String execute(){
                    request.put("a", "aa");
                    session.put("b", "bb");
                    application.put("c", "cc");
                    return "success";
                }
    
                @Override
                public void setRequest(Map<String, Object> arg0) {
                    this.request = request;
                }
                @Override
                public void setApplication(Map<String, Object> application) {
                    this.application = application;
                }
                @Override
                public void setSession(Map<String, Object> session) {
                    this.session = session;
                }
      }    


        方式3:获取真实类型HttpServletRequest,HttpSession,ServletContext的引用
           

       public class UserAction extends ActionSupport {
                private HttpServletRequest request;
                private HttpSession session;
                private ServletContext application;
                
                public UserAction(){
                    request = ServletActionContext.getRequest();
                    session = request.getSession();
                    application = session.getServletContext();
                }    
       }


        
        方式4:实现ServletRequestAware接口(依赖注入,IOC)
        
          

     public class UserAction extends ActionSupport implements ServletRequestAware {
                private HttpServletRequest request;
                private HttpSession session;
                private ServletContext application;
                @Override
                public void setServletRequest(HttpServletRequest request) {
                    this.request = request;
                    this.session = request.getSession();
                    this.application = session.getServletContext();        
                }    
    }


    8.struts2的模块的包含<include file="xxx.xml"/>意义远大
    9.struts2的默认Action:如果请求的Action不存在或者不指定请求的Action,会自动跳转到默认的Action。
       

    <package name="user" namespace="/user" extends="struts-default" >
            <default-action-ref name="default"></default-action-ref>
            <action name="default" >
                <result>/default.jsp</result>
            </action>
    </package>
  • 相关阅读:
    数据结构学习8——二叉树的销毁
    单链表的反向
    LNK4098: 默认库“MSVCRT”与其他库的使用冲突
    动态链接库(VC_Win32)
    注册表操作(VC_Win32)
    消息钩子与定时器(VC_Win32)
    套接字编程(VC_Win32)
    线程概述,优先级,睡眠,创建及终止(VC_Win32)
    进程通信(VC_Win32)
    进程概述及创建,终止(VC_Win32)
  • 原文地址:https://www.cnblogs.com/lnzr/p/4162036.html
Copyright © 2011-2022 走看看