Struts2系列(二)Action
一.Action是Struts2的核心,所有用户请求都需要使用Action处理并返回数据。
二.Action测试代码
直接上代码,具体解释见代码注释
代码演示内容:创建Action,Action默认值,Action获取参数
必不可少之主配置文件struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
1.struts配置文件
新建文件名称必须为struts.xml放在src目录下
2.关于约束导入
导包后在struts2-core-2.3.24.jar/struts-2.3.dtd找到约束文件
将文件中的内容复制到新建文件struts-2.3.dtd中
导入到开发环境,复制约束声明到struts.xml
如果正确提示标签,则证明导入成功
-->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
".3.dtd">
<struts>
<!-- package元素详解
package:将action配置封装,可以在package中配置多个action。
name:名称,随便起名。不能与其他包名重复。
namespace:给action访问路径中定义一个命名空间。
extends(必选):继承一个指定的包。struts-default是默认提供的包。
由struts2-core-2.3.24.jar/struts-default.xml提供
abstract:包是否为抽象的,标识性属性。标识不能独立运行,用于继承。
-->
<package name="hello" namespace="/hello" extends="struts-default">
<!-- action元素详解
name:action的访问资源名称。
class:action的完整类名。
method:指定调用action类中那个方法处理请求。
-->
<action name="helloaction" class="cjx.action.HelloAction" method="hello">
<!-- result元素详解
name:标识结果处理的名称与action方法的返回值对应。
type:指定调用哪一个result类来处理结果,默认使用转发(dispatcher)。
其他的还有重定向(redirect),链(转发到action)(chain),重定向到action(redirectAction)
struts2-core-2.3.24.jar/struts-default.xml内置了处理方式
标签体:填写页面的相对路径。
-->
<!-- http://localhost:8080/struts2/hello/helloaction -->
<result name="success" >/hello.jsp</result>
</action>
</package>
<!-- struts常量配置
struts2-core-2.3.24.jar/org.apache.struts2/default.properties描述了有哪些常量
关于struts.i18n.encoding的配置
1.可以新建一个properties配置文件,将需要的常量复制到文件中(中间加载,会覆盖之前的)
2.在web.xml配置如下属性(最后加载,会覆盖之前的)
<context-param>
<param-name>struts.i18n.encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
3.可以使用如下constant 属性配置常量(常用)(最先加载)
-->
<!-- i18n:国际化(Internationalization:i和n中间有18个字母). 解决post乱码-->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<!-- 指定访问action的后缀名,默认值action和空,可以修改,此处未改-->
<constant name="struts.action.extension" value="action,,"></constant>
<!-- 指定Struts2是否以开发模式运行
可以热加载主配置(不需重启即可生效)
提供更多的错误信息输出,但是会消耗更多资源
-->
<constant name="struts.devMode" value="true"></constant>
<!-- 引入其他配置文件 -->
<include file="cjx/action/UserActionStruts.xml"></include>
<include file="cjx/action/DefaultActionStruts.xml"></include>
<include file="cjx/action/ParamActionStruts.xml"></include>
</struts>
必不可少之web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="" xmlns="" xsi:schemaLocation=" .xsd" id="WebApp_ID" version="3.1">
<display-name>struts2</display-name>
<!-- struts2是基于过滤器(拦截器)的框架,只有配置了过滤器才能启用struts2框架 -->
<filter>
<filter-name>struts2</filter-name>
<!-- struts2核心过滤器,必须配置这个。Ctrl+Shift+T查找StrutsPrepareAndExecuteFilter,复制完整类名 -->
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<!-- 配置struts2要处理项目中的那些请求。/*表示所有请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
HelloAction.java
//import com.opensymphony.xwork2.Action;
//import com.opensymphony.xwork2.ActionSupport;
public class HelloAction {//Struts2的第一个测试
public String hello(){
/*搭建struts2框架
* 1.导包
* ···\struts-2.3.24\apps\struts2-blank.war是一个空白项目
* 把空白项目中的包导入即可
* 2.书写Action类
* 3.书写src/struts.xml
* 4.将struts2核心过滤器配置到web.xml
* 5.测试
*/
System.out.println("Hello World!You get Struts2!");
return "success";
}
}
/*Action类规范
* 方式1:创建一个类,可以是POJO(不继承父类,不实现接口的类),需要一个公共的无参构造方法和Action方法。
* Action方法要求:
* 方法权限修饰符为public
* 返回一个字符串,指示下一个页面的Result
* 方法没有参数
* public String xxx() throws xxx{
* return null;
* }
* 好处:代码侵入性低(但是使用servlet需要实现它的接口)
* 方式2:实现一个action接口
* 里面有execute方法,提供action方法的规范.
* Action接口预置了一些字符串.可以在返回结果时使用.
public class AboutAction implements Action{
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return null;
}
}
*方式3:继承ActionSupport类
*帮我们实现了 Validateable, ValidationAware, TextProvider, LocaleProvider接口 .
*如果我们需要用到这些接口的实现时,不需要自己来实现了.
class AboutAction extends ActionSupport{
}
*/
DefaultAction.java
public class DefaultAction extends ActionSupport {//Struts2默认值测试
public String execute(){
System.out.println("Struts2默认值测试");
return "success";
}
}
DefaultActionStruts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
".3.dtd">
<struts>
<package name="default" namespace="/default" extends="struts-default">
<!-- 如果找不到包下的action,会使用默认配置的action -->
<default-action-ref name="default"></default-action-ref>
<!-- 默认值
action method属性:execute
result name属性:success
result type属性:dispatcher (转发)
action class属性:不写class属性会使用Struts2的默认值,也不会调用方法
在文件struts2-core-2.3.24.jar/struts-default.xml最下面
<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
-->
<action name="default" class="cjx.action.DefaultAction" >
<result>/hello.jsp</result>
</action>
</package>
</struts>
hello.jsp
Hello World!This is Struts2!<br>
UserAction.java
public class UserAction {//动态方法调用演示
public String add(){
System.out.println("添加用户!");
return "success";
}
public String delete(){
System.out.println("删除用户!");
return "success";
}
public String update(){
System.out.println("修改用户!");
return "success";
}
public String find(){
System.out.println("查找用户!");
return "success";
}
}
UserActionStruts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
".3.dtd">
<struts>
<!-- 动态方法调用:方法一。不配置method,开启动态方法常量
在地址栏输入路径+!+方法名,可以调用方法,例如调用add方法
http://localhost:8080/struts2/user/useraction!add
此方法不利于SEO优化(搜索引擎查找)
-->
<!-- 开启动态方法配置的常量,默认关闭 -->
<!--
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
-->
<!--
<package name="dynamic" namespace="/user" extends="struts-default">
<action name="useraction" class="cjx.action.UserAction" >
<result name="success"></result>
</action>
</package>
-->
<!-- 动态方法调用:方法二。通配符*
action name="useraction*"
后面加个*(星号)
method="{1}"
{1}取出*输入的内容,{2}取出第二个*输入的内容
-->
<package name="dynamic" namespace="/user" extends="struts-default">
<action name="useraction*" class="cjx.action.UserAction"
method="{1}">
<result name="success"></result>
</action>
</package>
</struts>
ParamActionStruts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
".3.dtd">
<struts>
<package name="param" namespace="/param" extends="struts-default">
<action name="paramaction" class="cjx.action.ParamAction" >
<result name="success">/form.jsp</result>
</action>
<action name="paramaction2" class="cjx.action.ParamAction2" method="exe">
<result name="success">/form.jsp</result>
</action>
<action name="paramaction3" class="cjx.action.ParamAction3" method="cute">
<result name="success">/form.jsp</result>
</action>
</package>
</struts>
form.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
<div style="float: left;">
<form action="${pageContext.request.contextPath}/param/paramaction" method="post">
方式一:属性驱动和模型驱动<br>
post-name:<input type="text" name="name"><br>
post-age:<input type="text" name="age"><br>
post-date:<input type="text" name="date"><br>
<input type="submit" value="提交">
</form><br>
<form action="${pageContext.request.contextPath}/param/paramaction" method="get">
方式一:属性驱动和模型驱动<br>
get-name:<input type="text" name="name"><br>
get-age:<input type="text" name="age"><br>
get-date:<input type="text" name="date"><br>
<input type="submit" value="提交">
</form><br>
<form action="${pageContext.request.contextPath}/param/paramaction" method="post">
方式二:对象驱动(注意name值)<br>
name:<input type="text" name="user.name"><br>
age:<input type="text" name="user.age"><br>
date:<input type="text" name="user.date"><br>
<input type="submit" value="提交">
</form><br>
<form action="${pageContext.request.contextPath}/param/paramaction2" method="post">
方式三:模型驱动<br>
name:<input type="text" name="name"><br>
age:<input type="text" name="age"><br>
date:<input type="text" name="date"><br>
<input type="submit" value="提交">
</form><br>
</div>
<div style="float: inherit;">
<form action="${pageContext.request.contextPath}/param/paramaction3" method="post">
list集合类型封装<br>
list:<input type="text" name="list"><br>
list:<input type="text" name="list[2]"><br>
list:<input type="text" name="list[4]"><br>
list*:<input type="text" name="list[2]"><br>
list*:<input type="text" name="list[4]"><br>
<br>map集合类型封装<br>
map:<input type="text" name="map['one']"><br>
map:<input type="text" name="map['two']"><br>
map:<input type="text" name="map['three']"><br>
map*:<input type="text" name="map['one']"><br>
map*:<input type="text" name="map['one']"><br>
<input type="submit" value="提交">
</form><br>
</div>
</body>
</html>
ParamAction.java
//如何获得参数
public class ParamAction extends ActionSupport {
//方式一:属性驱动
//准备与参数名称相同的属性和get,set方法
//每次请求都会创建action对象(原因)
//自动类型转换只能转换基本数据类型及其包装类和date类型
private String name;
private Integer age;
//date类型只能转换yyyy-MM-dd类型字符串
private Date date;
//方式二:对象驱动
//准备与参数名称相同的实体类和属性和get,set方法
private User user;
/*演示代码*/
public ParamAction() {//构造参数
System.out.println("Action创建了");
}
public String execute() throws Exception {
System.out.println("方式一:name参数:"+name+";age参数:"+age+";date参数:"+date);
System.out.println("方式二:"+user);
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
ParamAction2.java
public class ParamAction2 extends ActionSupport implements ModelDriven<User>{
//方式三:模型驱动
//准备与参数名称相同的属性但没有get,set方法
//实现接口ModelDriven<T>,T为要封装的对象,实现未实现方法
private User modeluser=new User();
@Override
public User getModel() {//实现接口ModelDriven<T>未实现方法
//只需要把要封装的对象return 即可
//但是要注意:属性必须new出要封装的对象,否则会返回null
return modeluser;
}
/*演示代码*/
public ParamAction2() {//构造参数
System.out.println("Action创建了");
}
public String exe() throws Exception {
System.out.println("方式三:"+modeluser);
return SUCCESS;
}
}
ParamAction3.java
public class ParamAction3 {//集合类型封装
private List<String> list;
private Map<String, String>map;
public String cute() throws Exception {
System.out.println("list:"+list);
System.out.println("map:"+map);
return "success";
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
}