struts.xml文件中 action 标签中几个属性的作用

  1.name:为action命名,输入url访问时,需要带上action的name,通过name知道访问哪个action(通过class属性)

  2.class:指定需要执行的action的类名,如果不指定,会使用struts2默认的一个action,同样会返回某个字符串结果

自己的Action类的书写有三种方式:

在不指定调用什么方法的情况下,默认会调用 访问的Action的 execute方法 ,

也是通过这个 execute方法的返回值来确定 跳转到哪个页面

  1.自己编写 execute方法,返回某个字符结果集(如 "success")

 public class IndexAction1 {
public String execute() {
return "success";
}
}

   2.实现Action接口,因为是接口,里面没有方法的实现,所以都必须自己去实现这些方法

 public class IndexAction2 implements Action {
@Override
public String execute() {
return "path";
}
}

  3.继承ActionSupport类,好处:ActionSupport中封装了很多方法可以直接使用  /*一般使用第三种*/

 public class IndexAction3 extends ActionSupport {
@Override
public String execute() {
return "success";
}
}

注:Action 中 execute 的方法的返回结果(String)和 struts.xml 中的 result 中的nae 属性相对应

访问Action的过程:0.在前面struts2访问过程的基础上(之前没有写Action)

         1.请求访问某个action(根据该action 中的 name属性)

         2.根据action 的name ,得到action的class,通过该class /*new出一个IndexAction*/

         3.执行该action的execute方法,返回某个字符串结果与result中的name属性进行匹配,

          如果是匹配的话,就转发到result包含的页面进行显示

注:struts2和 struts1 的一个重要的区别就是:struts2 每次访问这个Action都会创建一个Action对象 (虽然比较消耗内存,但是可以避免并发问题)

  而在struts1中,IndexAction 只会被创建一次(所以会有并发问题)

动态方法调用

Action 执行的时候不一定要执行execute方法,可以在配置文件中配置 action 的 method属性 来指定执行Action中的哪个方法

但是这样一个方法就要配置一个Action,会配置太多的 Action,所以不好

也可以在url 地址中动态指定(动态方法调用 DMI):

  如:<a href="<%=context %>/user/user!add">添加用户</a>  调用userAction的add方法

    <a href="<%=context %>/user/user!delete">删除用户</a>  调用userAction的delete方法

通配符

使用通配符,可以将配置量降到最低(减少struts.xml中的配置)

不过,一定要遵循 "约定优于配置"的原则(即 通配符使用的前提是项目人员对命名等有相同的约定)

例:

  <action name="*_*" class="com.bjsxt.struts2.wildcard.action.{1}Action" method="{2}">

    <result name="success">/{1}{2}Success.jsp</result>

  </action>

  <a href="<%=context %>/actions/Teacher_Delete">删除老师</a>,当点击这个超链接时 

  第一个* 代表了Teacher  第二个*代表了 Delete

  (这样设置的话,struts.xml基本就不需要修改了,只需要修改Action 和 JSP显示页面就可以;)

  

使用Action 接收参数的三种方式

  1.使用action 属性接收参数:1.在action中增加需要接收的属性(get set方法) 2.通过地址栏的输入为属性赋值

  2.使用Domain Model(或DTO)接收参数:

    1.创建一个User实体

    2.在action中把User当做属性(不需要new),为其设置set get方法

    3.通过地址栏的输入为属性赋值(需要指定model 如:user.name=xzk)

  过程应该是这样的:请求发送,找到对应的Action, 请求里面有user.name=xzk,就去找user,发现没有new, struts2就帮他new一个

  new 完之后,就往里面设值(set方法),注意地址栏中的对象的名称必须和Action中对象的名称保持一致,否则struts2都不知道去 new 谁

  3.使用ModelDriven接收参数

    1.创建一个User实体

    2.让Action 实现 ModelDriven 接口,重写getModel()方法

    3.在Action创建一个User实例对象(需要new出来),用于接收前台传来的参数

  Action实现ModelDriven 后的访问过程:

    1.拿到Action的class后,new一个action

    2.询问该Action是否实现了ModelDriven接口

    3.如果实现了,调用getModel方法,拿到Model(User)对象(action中创建的实例对象)

    4.根据这个user,完成 get set方法

  如果没有实现ModelDriven,则struts会自己new 一个,然后去get set

  这也是为什么使用Domain Model接收参数 只需要private User user; 而不需要new的原因(当然new 也可以)

注:不一定要通过地址栏(get方法)来符属性赋值,可以使用Post方法,直接将表单提交到对应的action,只要action中有相应属性

字符编码问题:想接收传来的中文数据,需要在struts.xml文件配置

  <constant name="struts.i18n.encoding" value="GBK" />

(注:struts2.1.6 有Bug ,仍然无法解决编码问题)为了完成实验,需要 修改 web.xm文件 使用之前版本的过滤器

简单数据校验

  1.发送数据给struts,通过struts.xml 找到 需要new 哪个action,将数据给这个action去处理

  2.如果传递过来的数据符合要求,则返回SUCCESS等,跳转相应页面

  3.如果数据不符合要求,则需要记录错误信息(this.addFieldError("error", "name is error");)

  

  4.在error 处理页面,取出错误信息并显示 , 需要导入 struts的标签库

    

 <?xml version="1.0" encoding="GB18030" ?>
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
<title>Insert title here</title>
</head>
<body>
<s:fielderror name="error"></s:fielderror>
<s:property value="errors.error[0]"></s:property>
<s:debug></s:debug>
</body>
</html>

    <s:fielderror name="error"></s:fielderror>    (显示 name 为 error 的Map所有数据)

    <s:property value="errors.error[0]"></s:property>

    (这个value栈的名字叫 errors,存放所有错误信息的栈 显示 name 为 error 的Map的第一个数据

  注:在使用 this.addFieldError(",")后,数据是存放在 'value栈(name是String value是Map)' 中,

    可以通过 <s:debug></s:debug> 生成的链接查看

    s:fielderror 和 s:property的区别:1.一个默认取出全部数据,一个单独取出某个数据

    2.s:fielderror得到的数据会按照struts默认的格式显示(不常用) s:property直接得到的 就是一段字符串

Action 中访问 web元素的方法(一)(如:取得Map类型request,session,application)

  1.在Action中,通过ActionContext.getContext()方法得到 ActionContext 对象,

  ActionContext对象 作用:得到Action执行的环境,上下文, ActionContext中有Web元素

  2.通过ActionContext对象,得到想要的web元素,

  

  3.为web元素添加属性 request.put("r1", "r1");

  4.在JSP页面使用s:property标签,使用Web元素  如:<s:property value="#request.r1"/>

  或 <s:property value="#attr.r1"/>(不常用,虽然也可以查出,但是不精确)

  

注:

  1.struts相当于一个中介,请求时会将一些Web元素转换为Map对象,响应时又会将这些Map转换成Web元素供jsp调用显示,

  对象通过ActionContext得到的都是 Map对象,如 Map request = (Map)ActionContext.getContext().get("request"); 所以为request添加属性,是使用put方法

  2.struts中的request等在 'Stack Context' 中,<s:debug></s:debug> 可以看到,

  在 'Stack Context'中的这些项目需要使用 '#'  来调用,<s:property value="#request.r1"/>

访问Web元素的方法(二)(常用)

  1.在Action中,让Action实现RequestAware,SessionAware,ApplicationAware 这种接口,

  2.实现这些接口,需要重写一些方法,如setRequest(Map<String, Object> request) 这个方法

  体现了 (DI)依赖注入 和 (IOC)控制反转

  所谓依赖注入:Action中创建的request对象需要等待这个方法的调用来对其完成注入,否则这个对象就为空了 ;

   所谓控制反转,就是控制权由应用代码中转到了外部容器,这个对象的控制权由struts容器决定

 //struts容器会检测是否实现了相应的接口,如果实现了,struts容器的调用就会调用这些方法复制,

 //所以说,这些对象的控制权交到了struts容器的手上

访问Web元素的方法(三、四)(真实类型 HttpServletRequest, HttpSession, ServletContext)

  1.(三)在Action中,让Action实现ServletReuqestAware接口,实现该接口提供的方法后(依赖注入和控制反转),就可以得到HttpServletRequest

  通过request得到session,通过session得到ServletContext

  2.(四)在Action中,直接创建HttpServletRequest,HttpSession,ServletContext,使用ServletActionContext,得到HttpSession ServletContext

2.Struts2-Action的更多相关文章

  1. struts2 action配置时 method 省略不写 默认执行方法是父类ActionSuppot中的execute()方法

    struts2 action配置时 method 省略不写 默认执行方法是父类ActionSuppot中的execute()方法

  2. struts2 action 页面跳转

    struts2 action 页面跳转 标签: actionstruts2redirect 2013-11-06 16:22 20148人阅读 评论(0) 收藏 举报 (1)type="di ...

  3. Java Hour 32 Weather ( 5 ) struts2 – Action class

    有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. Hour 32 Struts2 Action 1 将action 映射到 ac ...

  4. Struts2 Action接收表单参数

    struts2 Action获取表单传值    1.通过属性驱动式    JSP:        <form action="sys/login.action" method ...

  5. struts2 action result type类型

    struts2 action result type类型 1.chain:用来处理Action链,被跳转的action中仍能获取上个页面的值,如request信息. com.opensymphony. ...

  6. struts2 action通配符

    首先,看一个struts2的配置文件: <package name="actions" extends="struts-default" namespac ...

  7. 第三章Struts2 Action中动态方法调用、通配符的使用

    01.Struts 2基本结构 使用Struts2框架实现用登录的功能,使用struts2标签和ognl表达式简化了试图的开发,并且利用struts2提供的特性对输入的数据进行验证,以及访问Servl ...

  8. [Struts2] Action Implements SessionAware

    struts2 的Action中若希望访问Session对象,可采用两种方式: 1.从ActionContext中获取: 2.实现SessionAware接口. 1.从ActionContext中获取 ...

  9. Struts2 Action下面的Method调用方法

    1. 在struts.xml中加入<constant name="struts.enable.DynamicMethodInvocation" value="tru ...

  10. Struts2 Action中动态方法调用、通配符的使用

    一.Struts2执行过程图: 二.struts2配置文件的加载顺序 struts-default.xml---struts-plugin.xml---struts.xml 具体步骤: 三.Actio ...

随机推荐

  1. Grafana添加Zabbix为数据源(二)

    接触过grafana的同学肯定会觉得grafana比zabbix的图像灵活好看很多,下面就让我们一起进行grafana的web界面配置 1.鼠标移动到左上角,点击Plugins,然后选择"c ...

  2. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-1.数据信息安全--微信授权一键登录功能介绍

    笔记 1.数据信息安全--微信授权一键登录功能介绍 简介:讲解登录方式优缺点和微信授权一键登录功能介绍         1.手机号或者邮箱注册             优点:              ...

  3. Java排序方法

    下面是用JAVA代码实现的数据结构中的7种基本排序算法,希望对你有所帮助. (1)直接插入排序 /** 直接插入排序 **/ /** 数组是引用类型,元素值将被改变 **/ public static ...

  4. Python 线程----线程方法,线程事件,线程队列,线程池,GIL锁,协程,Greenlet

    主要内容: 线程的一些其他方法 线程事件 线程队列 线程池 GIL锁 协程 Greenlet Gevent 一. 线程(threading)的一些其他方法 from threading import ...

  5. docker容器内存和CPU使用限制

    docker容器内存和CPU使用限制 示例如下 sudo docker run --name seckill0 -p 8080:8080 -m 1024M --cpus=0.2 -d seckill: ...

  6. 自动化运维:(3)写一个简单的Shell脚本(案例)

    一.需求 1.test.sh 脚本执行时候需要添加参数才能执行 参数和功能详情如下: 参数 执行效果 start 启动中... stop 关闭中... restart 重启中... * 脚本帮助信息. ...

  7. bug解决思路——插入数据时,前台不展示数据

    积攒一下平时解决bug时的思路,以后若是一头乱麻时翻出来看看~ 一个bug五一之前就和现场在定位,直到今天才算是定位到问题. 所有bug,还是得重现出来才可以发现问题.现场说登记记录时数据没在前台展示 ...

  8. 【神经网络与深度学习】转-caffe安装吐血总结

    这周安装了caffe的windows版本和Linux版本,依赖关系太多,如果系统选对了,安装起来很easy,选错了,就会遇见各种坑. 1.操作系统最好使用ubuntu desktop 14.04 64 ...

  9. airflow 安装配置celery+rabbitmq celery+redis

    AirFlow的安装可以参考:https://www.cnblogs.com/braveym/p/11378851.html 这里介绍的是AirFlow 安装配置celery+rabbitmq   和 ...

  10. Capacity To Ship Packages Within D Days

    A conveyor belt has packages that must be shipped from one port to another within D days. The i-th p ...