1.创建动作类(三种方式)
1.使用普通方式javaBean作为Action动作类,不需要继承任何父类,也不需要实现接口。
- 方法一定是public公用的,
- 返回值是字符串用来决定跳转到哪个视图
- 不需要参数
- 方法名自定义,如果不自定义的话,有个默认的方法名execute
public class HelloAction {
public String hello(){
System.out.println("任亮讲师");
return "success";
}
/**
* 当前请求没有绑定方法的时候自动找execute默认的方法
* @return
*/
public String execute(){
System.out.println("任亮是一个好讲师");
return "success";
}
}
2.创建动作类实现接口com.opensymphony.xwork2.Action
配置完成如图所示:
public interface Action {
/**
* The action execution was successful. Show result
* view to the end user.
*/
public static final String SUCCESS = "success";
/**
* The action execution was successful but do not
* show a view. This is useful for actions that are
* handling the view in another fashion like redirect.
*/
public static final String NONE = "none";
/**
* The action execution was a failure.
* Show an error view, possibly asking the
* user to retry entering data.
*/
public static final String ERROR = "error";
Action接口中提供了一些常量
常量 |
值 |
说明 |
SUCCESS |
Success |
返回成功页面 |
NONE |
None |
不返回任何页面 |
ERROR |
Error |
返回错误提示页面 |
INPUT |
Input |
当提交表单时发生错误,就跳回表单页面 |
LOGIN |
Login |
返回登录页面 |
3.创建动作类继承父类
com.opensymphony.xwork2.ActionSupport
(推荐使用)
public class HelloAction2 extends ActionSupport{
}
//(ActionSupport可点击查看源码)
2.配置动作类
<!--
name:必须指定在一个包中唯一
class:当前action所在的动作类
method:当前action要访问的方法
-->
<action name="as" class="com.rl.action.HelloAction2" method="helloAS">
<result name="success">/success.jsp</result>
</action>
3.action动作类的生命周期
创建:Action动作类每次请求的时候都会创建一个实例对象
销毁:当前action动作类的请求响应完后就消失了
跟javaweb中的HttpServletRequest的生命周期是一样的,struts2是多例的,线程安全的
4.action动作类的访问
通配符 (一个*)
原则:约定优于配置
在action中每一个方法有一定的规则:都以User结尾
public class HelloAction2 extends ActionSupport{
public String saveUser(){
System.out.println("我被保存了");
return super.SUCCESS;
}
public String updateUser(){
System.out.println("我被修改了");
return super.SUCCESS;
}
}
<struts>
<package name="hello" extends="struts-default">
<action name="*" class="com.zy.action.HelloAction2" method="{1}User">
<result name="success">/{1}User.jsp</result>
</action>
</package>
</struts>
*如果是save的话,method= saveUser,则返回/saveUser.jsp。
创建save.jsp和update.jsp
访问http://localhost:8080/strus2/save
结果:
通配符 (两个*)
public class HelloAction2 extends ActionSupport{
public String save_User(){
System.out.println("我被保存了");
return super.SUCCESS;
}
public String update_User(){
System.out.println("我被修改了");
return super.SUCCESS;
}
}
<struts>
<package name="hello" extends="struts-default">
<!-- <action name="*" class="com.zy.action.HelloAction2" method="{1}User">
<result name="success">/{1}User.jsp</result>
</action> -->
<action name="*_*" class="com.zy.action.PersonAction" method="{1}_{2}">
<result name="success">/{1}{2}.jsp</result>
</action>
</package>
</struts>
创建savePerson.jsp和updatePerson.jsp
访问http://localhost:8080/strus2/update_Person
注意:同一个包中不能有多个通配符的action
动态方法调用
首先要开启动态方法调用的开关
public class Hello extends ActionSupport{
public String hello1(){
System.out.println("hello1");
return super.SUCCESS;
}
public String hello2(){
System.out.println("hello1");
return super.SUCCESS;
}
public String hello3(){
System.out.println("hello1");
return super.SUCCESS;
}
}
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
//启用动态方法调用
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<package name="hello" extends="struts-default">
<action name="zhangyan" class="com.zy.action.Hello">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
这时我们的action的动作类不需要再指定方法method属性了,而是在url上指定
语法: !方法名[.后缀名]
http://localhost:8080/strus2/zhangyan!hello1
5.结果视图的配置
<result name="success">/success.jsp</result>
Result:要返回的视图
属性:
Name:action动作类要返回的值,如果返回的值匹配上了当前的name的值就跳转到相应的页面
Type:跳转方式(type在struts-default.xml的文件中,自行查看,这里写主要学的几个type)
public class Hello extends ActionSupport{
public String hello(){
return super.SUCCESS;
}
}
- Dispatcher:请求转发,相当于javaweb中的forward,地址栏不变,在我们不知道type的时候默认是dispatcher
- Redirect:页面重定向,地址栏变化
public class Hello extends ActionSupport{
public String hello(){
return super.SUCCESS;
}
}
public class Hello1 extends ActionSupport{
public String hello1(){
return super.SUCCESS;
}
}
访问 :http://localhost:8080/strus2/zhangyan
跳到:http://localhost:8080/strus2/success.jsp
3.Chain:请求转发到一个action动作类,地址栏不发生变化
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<package name="hello" extends="struts-default">
<action name="zhangyan" class="com.zy.action.Hello" method="hello">
<result name="success" type="chain">zhangyan1</result>
</action>
<action name="zhangyan1" class="com.zy.action.Hello1" method="hello1">
<result name="success">/success1.jsp</result>
</action>
</package>
</struts>
4.redirectAction:重定向到一个action的动作类,地址栏变化
1.同包内的重定向
访问 :http://localhost:8080/strus2/zhangyan
跳到:http://localhost:8080/strus2/zhangyan1.action
2. 不同包内的重定向(result需要通过param来指定namespace和actionName)
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<package name="hello" extends="struts-default">
<action name="zhangyan" class="com.zy.action.Hello" method="hello">
<result name="success" type="redirectAction">
//重定向的action的name
<param name="actionName">zhangyan1</param>
</result>
</action>
</package>
<package name="hello1" extends="struts-default">
<action name="zhangyan1" class="com.zy.action.Hello1" method="hello1">
<result name="success">/success1.jsp</result>
</action>
</package>
</struts>
5.stream:文件的上传和下载。
6.局部结果视图和全局的结果视图
在一个action中配置的result是局部结果视图,外部的action是不能使用这个result
包内的全局的结果视图配置对于包内的每一个action动作类都有效
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<package name="hello" extends="struts-default">
<!-- 包级别的全局结果视图-->
<global-results>
<result name="error">/error.jsp</result>
</global-results>
<action name="zhangyan" class="com.zy.action.Hello" method="hello">
<result name="success" type="redirectAction">
<param name="actionName">zhangyan1</param>
</result>
</action>
<action name="zhangyan1" class="com.zy.action.Hello1" method="hello1">
<result name="success">/success1.jsp</result>
</action>
</package>
</struts>
在整个系统中的全局的结果视图,通过继承的方式来实现
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<package name="basePackage" extends="struts-default" abstract="true">
<global-results>
<result name="error">/error.jsp</result>
</global-results>
</package>
<package name="hello" extends="basePackage">
<!-- 包级别的全局结果视图-->
<global-results>
<result name="error">/error.jsp</result>
</global-results>
<action name="zhangyan" class="com.zy.action.Hello" method="hello">
<result name="success" type="redirectAction">
<param name="actionName">zhangyan1</param>
</result>
</action>
</package>
<package name="hello1" extends="basePackage">
<action name="zhangyan1" class="com.zy.action.Hello1" method="hello1">
<result name="success">/success1.jsp</result>
</action>
</package>
</struts>