博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Struts2 Action
阅读量:5248 次
发布时间:2019-06-14

本文共 7247 字,大约阅读时间需要 24 分钟。

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
  

/hello.jsp
/hello.jsp

 

2.action:  

  
/hello.jsp

    实现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

/user_add_success.jsp

 

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

/user_{1}_success.jsp

 

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

/{1}_{2}_success.jsp

 

5.action的属性来接受参数

/user_add_success.jsp

    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
{ private User user; @Override public User getModel(){ return user; } }           struts2会自动调用 getModle()并将参数name和age传递给user;

6.struts2的编码问题:

只需要在struts.xml中配置

 

不用配置 ,因为他的默认值就是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
request; private Map
session; private Map
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:
          

       

 

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

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

 

        方式3:(attr会自动的寻找属性名a,b,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
request; private Map
session; private Map
application; public String execute(){ request.put("a", "aa"); session.put("b", "bb"); application.put("c", "cc"); return "success"; } @Override public void setRequest(Map
arg0) { this.request = request; } @Override public void setApplication(Map
application) { this.application = application; } @Override public void setSession(Map
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。
   

/default.jsp

 

转载于:https://www.cnblogs.com/lnzr/p/4162036.html

你可能感兴趣的文章
react双组件传值和传参
查看>>
BNU29140——Taiko taiko——————【概率题、规律题】
查看>>
[Kaggle] Sentiment Analysis on Movie Reviews
查看>>
价值观
查看>>
mongodb命令----批量更改文档字段名
查看>>
CentOS 简单命令
查看>>
使用&nbsp;SharedPreferences 分类: Andro...
查看>>
TLA+(待续...)
查看>>
题解: [GXOI/GZOI2019]与或和
查看>>
MacOS copy图标shell脚本
查看>>
国外常见互联网盈利创新模式
查看>>
Oracle-05
查看>>
linux grep 搜索查找
查看>>
Not enough free disk space on disk '/boot'(转载)
查看>>
android 签名
查看>>
vue项目中使用百度统计
查看>>
android:scaleType属性
查看>>
SuperEPC
查看>>
mysql-5.7 innodb 的并行任务调度详解
查看>>
shell脚本
查看>>