Struts2__Action

struts2配置

找一个基础的struts2的项目
  1. 将WEB-INF目录下的jar包拷贝过来
  2. 将struts.xml文件拷贝到src目录下
  3. 配置web.xml,将现有项目中<filter>的内容拷贝到现有项目中
  4. 配置struts.xml文件,将<struts>...<\struts>中间的内容全部注释, 单独将<package>的内容拷贝出来,并删除其他内容,只保留
        <action name="hell">
            <result >
                /Hello.jsp
            </result>
        </action>   

并且修改action的名字,以及result

  1. 将项目设置为开发模式,是的改动随时能够体现出来
<constant name="struts.devMode" value="true" />

Struts2的基本执行流程

核心思想:将请求和试图分开

struts2执行过程.png

  • 1.client 收到http请求
  • 2.client将请求提交给tomcat
  • 3.tomcat收到请求后参照配置文件web.xml中的filter,然后提交给struts2filter去处理(调用doFilter())。
  • 4.struts2filter参考配置文件struts.xml文件,首先参考namespace="/",然后找对应的action, 然后找对应的<result>,最后将对应的请求forward给对应的.jsp文件。
    • 4.1 若没有对应的namespace则返回web.xml交给Tomcat去处理。
  • 5..jsp文件将结果(展现视图)反馈return给客户端。

Action

主要内容
  1. Namespace
  2. 定义自己的Action
  3. 路径设置
  4. 调用Action的自定义方法
  5. 通配符
  6. 接收用户输入(三种方式)
  7. 乱码问题解决
  8. 简单数据校验
  9. action中访问web元素
  10. 包含模块配置文件
  11. 默认action

namespace

package

Java中是给类打个包,解决重名的问题。
此处类似,action的名字相同的情况下,可以使位于不同的package下。

struts.xml文件解读

namespace解读.png
  1. namespace必须以/开头,访问的时候也要加/
  2. result的名字默认为success可以不写。<result name="success" >
  3. namespace为空 只要找到名字index(也可以为其他)的action而且没有找到和他精确对应的package时,都交给该package处理。即囊括了其他package处理不了的action
  4. 上图的访问地址为,其中.action可以省略。
http://localhost:8080/Struts2_0200_NameSpace/front/index.action

action实现

  1. 具体视图的返回可以由用户自己定义的Action来决定
  2. 具体的手段是根据返回的字符串找到对应的配置项,来决定试图的内容
  3. 具体的Action的实现可以是一个普通的Java类,里面有public String execute方法即可或者实现Action接口
  4. 不过最常见的是从ActionSupport继承,好处在于可以直接使用Struts是封装好的方法

路径问题

struts中的路径问题是根据action的路径而不是jsp的路径来确定的,所以尽量不要使用相对路径。

DML(动态方法调用)

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

    <action name="user" class="com.UserAction">
        <result name = "success">
            /user_add_success.jsp
        </result>
    </action>
</package>
  1. 如上所示:一个package配置了两个action,都调用了com.UserAction类,第一个action制定了调用方法add(),然后利用add的返回值success,调用相应名字的result,这是静态调用。
  2. 第二个action只指定了相应的类,没有指定调用的方法,就可以根据???(不是很理解)动态绑定相应的result

通配符的使用

原则:约定优于配置

    <package name="actions" namespace="/actions" extends="struts-default">
        <action name="Student*" class="com.StudentAction" method="{1}">
            <result name = "{1}_success">
                /Student{1}_success.jsp
            </result>
        </action>
    </package>
  1. *通配符
  2. client 端请求如下
http://localhost:8080/Struts2_0600_Wildcard/actions/Studentadd.action
http://localhost:8080/Struts2_0600_Wildcard/actions/Studentdelete.action

com.StudentAction的函数如下:

public class StudentAction extends ActionSupport{
    public String add() {
        System.out.println("add");
        return "add_success";
    }
    public String delete() {
        System.out.println("delete");
        return "delete_success";
    }
}
  1. 两个请求只用使用一个action就可以了。
  2. 进一步可以扩大通配符的使用,一定要注意约定大于配置的原则
    <package name="actions" namespace="/actions" extends="struts-default">
        <action name="*_*" class="com.{1}Action">
            <result name = "{1}_{2}">
                /{1}_{2}_success.jsp
            </result>
        </action>
    </package>

接收参数

1.按照属性接收参数

public class UserAction extends ActionSupport{

    private String name;
    private int age;
    public void setName(String name) {
        this.name = name;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String add() {
        System.out.println("name = " + name);
        System.out.println("age = " + age);
        return "add_success";
    }
}
  1. 在action中定义属性用于接收参数,这里是使用set方法来接收参数,所以要注意方法的名字和参数传递的名字的问题。
  2. 参数传递在链接后直接加入参数值即可。
<a href="user/useradd.action?name=<%="admin" %>&age=<%= 23 %> ">添加学生</a><br>

2. DomainModel(域模型接收)

  1. 直接接收到对象中
  2. 参数传递形式
 <a href="user/useradd.action?user.name=<%="admin" %>&user.age=<%= 23 %>">添加学生</a><br>

简单数据验证

action中使用addFieldError方法对接收到的数据进行验证

  1. action中相应的函数
        if(name == null || !name.equals("admin")) {
            this.addFieldError("name", "name is error");
            this.addFieldError("name", "名字不正确!");
            System.out.println("error");
            return ERROR;
        }
  1. .jsp中接收返回的结果
    
    <s:fielderror fieldName="name" theme="simple"></s:fielderror> <br>
    <br>
    <s:property value="errors.name"/>
    <s:property value="errors.name[1]"/>
    <br>
    <s:debug></s:debug>

访问web元素(request, session, application)

最常用的方法IOC(Inverse of Control)反向控制 或者称为DI (denpenency input) 依赖注入。
流程如图所示

IOC.png

  1. 此处的aciont要实现RequestAware的接口,并实现setRequest()的方法;
  2. struts2在调用相应的action的时候会直接询问是否继承了上述接口并实现了方法,若是, 便调用该方法为action注入相应的元素。

模块包含

直接在struts.xml中使用include,就可以将其他的struts文件**.xml
直接引用进来,(相当于直接粘贴到此处)属于struts.xml文件的内容。

模块包含.png

默认action

若找不到相应的action,就默认访问这个action

默认action.png

Result结果集

结果集类型

image.png

全局result

概念:同一个package下的action 可以共用。

全局result.png

也可以使用extends继承另一个packaga的结果集。默认继承"struts-default"

动态结果集

${} : 用于在配置文件里,向值栈(value stack)里边取值。同时根据取得的结果动态指定不同的result
配置文件

动态结果集配置文件.png

action文件
动态结果集action文件.png

带参数的结果集

一次request只有一个值栈,使用forward进行跳转的action共用一个值栈,因为他们共用一个request。所以不用传递参数。
但是redirect需要,因为redirect会发起新的request,建立新的值栈。

带参数的结果集.png

2018-08-14 至此这一部分结束!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容