模型
目录
模型
拦截器:
结果类型:
域模型
package com.leo.struts2.dynamic;import com.opensymphony.xwork2.ActionSupport;
/*** 动态调用* @author leoi555**/
public class DemoAction extends ActionSupport {public String add() {System.out.println("添加用户");return "success";}public String delete() {System.out.println("删除用户");System.out.println("删除用户");return "success";}public String update() {System.out.println("修改用户");return "success";}public String find() {System.out.println("查找用户");return "success";}}
顺便看下如何进行对他进行动态调用的通过配置struts.xml
两种方式
一使用动态方法的常量:
使用时用loacalhost:8080/SturtsTest/DemoAction!add既可以访问Action中的add方法
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd">
<struts><!-- 配置动态方法是否开启的常量 默认为false的<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>--><package name="dynamic" extends="struts-default" namespace="/dynamic"><!-- 动态方法调用 使用{1}取出方法通过*来匹配符好--><action name="DemoAction" class="com.leo.struts2.dynamic.DemoAction"><!-- result是默认为success;type:dispatcher;转发class:默认为com.opensymphony.xwork2.ActionSupport;--><result name="success">/struts/index.jsp</result></action></package>
</struts>
模型驱动:
要实现ModelDriven接口,通过getModel()的方法来获取实体的对象模型,
package com.leo.struts2;import java.util.Iterator;import org.apache.catalina.Group;
import org.apache.catalina.Role;import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/*** 驱动模型* @author leoi555**/
public class UserActionModel extends ActionSupport implements ModelDriven<User>{private User user=new User();//@Overridepublic String execute() throws Exception {// TODO Auto-generated method stubreturn super.execute();}public String add() {System.out.println("添加用户");return "success";}public String delete() {System.out.println("删除用户");System.out.println("删除用户");return "success";}public String update() {System.out.println("修改用户");return "success";}public String find() {System.out.println("查找用户");return "success";}@Overridepublic User getModel() {// TODO Auto-generated method stubreturn this.user;}}
方式二在模型驱动中演示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd">
<struts><!-- 配置动态方法是否开启的常量 默认为false的<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>--><package name="dynamic" extends="struts-default" namespace="/dynamic"><!-- 动态方法调用 使用{1}取出方法通过*来匹配符好--><action name="DemoAction_*" class="com.leo.struts2.dynamic.UserAction"method="{1}"><!-- result是默认为success;type:dispatcher;转发class:默认为com.opensymphony.xwork2.ActionSupport;--><result name="success">/struts/index.jsp</result></action></package>
</struts>
调用时通过动态方法调用loacalhost:8080/SturtsTest/DemoAction_add即可以访问Action中的add方法
拦截器:
可以动态的增强Action对象的功能拦截器作用于Action和result之间,
在调用action之前提供预处理逻辑。
在调用action后提供后处理逻辑。
捕获异常,以便可以执行备用处理
实际中action将通过拦截器使用invocation.invoke()调用执行,所以你可以根据你的需求做一些预处理和一些后处理。
框架本身通过第一次调用ActionInvocation对象的invoke()来启动进程。每次调用invoke()时,
ActionInvocation都会查询其状态,并执行下一个拦截器。当所有配置的拦截器都被调用时,invoke()将使得action本身被执行。
/**
* 最常用的拦截器
* @author leoi555
*定制拦截器拦截的方法,
*定制哪些方法需要拦截
*哪些方法不需要拦截
*/
public class MyInterceptor2 extends MethodFilterInterceptor{
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
// TODO Auto-generated method stub
//前处理
System.out.println("前处理");
//放行
invocation.invoke();
//后续
System.out.println("后处理");
return "success";
}
}
现在我们需要注册新的拦截器,然后调用它,因为我们在前面的例子中调用的是默认拦截器。要注册一个新的拦截器
把<interceptors> ... </ interceptors>标签直接放置在<package>标签下的struts.xml文件中即可。
对于默认拦截器,你可以跳过此步骤,就像我们前面的示例中所做的那样。但现在让我们使用以下方法注册新的
<struts>
<package name="inter" namespace="/dynamic" extends="struts-default" >
<interceptors>
<!-- 注册拦截器 -->
<interceptor name="myInter2" class="com.leo.struts2.interceptor.MyInterceptor2 " ></interceptor>
<!-- 2注册拦截器栈 -->
<interceptor-stack name="myStack">
<!-- 自定义拦截器引入放到默认的之前 -->
<interceptor-ref name="myInter2">
<!-- 指定哪些方法不拦截
<param name="excludeMethods">add,delete</param> -->
<!-- 指定哪些方法需要拦截 -->
<param name="includeMethods">add,delete</param>
</interceptor-ref>
<!-- 引用默认的拦截器栈(20个) -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 3.指定指定的包 -->
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<action name="DemoAction_*" class="com.leo.struts2.dynamic.DemoAction" method="{1}">
<result name="result" type="dispatcher">/struts/index.jsp</result>
</action>
</package>
</struts>
package com.leo.struts2.interceptor;import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
/*** 最常用的拦截器* @author leoi555*定制拦截器拦截的方法,*定制哪些方法需要拦截*哪些方法不需要拦截*/
public class MyInterceptor2 extends MethodFilterInterceptor{@Overrideprotected String doIntercept(ActionInvocation invocation) throws Exception {// TODO Auto-generated method stub//前处理System.out.println("前处理");//放行invocation.invoke();//后续System.out.println("后处理");return "success";}}
配置struts.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd">
<struts><package name="inter" namespace="/dynamic" extends="struts-default" ><interceptors><!-- 注册拦截器 --><interceptor name="myInter2" class="com.leo.struts2.interceptor.MyInterceptor2 " ></interceptor><!-- 2注册拦截器栈 --><interceptor-stack name="myStack"><!-- 自定义拦截器引入放到默认的之前 --><interceptor-ref name="myInter2"><!-- 指定哪些方法不拦截<param name="excludeMethods">add,delete</param> --><!-- 指定哪些方法需要拦截 --><param name="includeMethods">add,delete</param></interceptor-ref><!-- 引用默认的拦截器栈(20个) --><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors><!-- 3.指定指定的包 --><default-interceptor-ref name="myStack"></default-interceptor-ref><action name="DemoAction_*" class="com.leo.struts2.dynamic.DemoAction" method="{1}"><result name="result" type="dispatcher">/struts/index.jsp</result></action></package>
</struts>
结果类型:
1.dispatcher结果类型是默认的类型,如果未指定其他结果类型,则使用此类型。
它用于转发到服务器上的servlet,JSP,HTML等页面。它使用RequestDispatcher.forward()方法。
2.redirect结果类型redirect结果类型调用标准的response.sendRedirect()方法,使得浏览器向给定的位置创建一个新请求。
我们可以在<result...>元素的主体中或作为<param name="location">的元素中给定位置。redirect也支持parse参数,
3.freeMaker不做说明
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="result" extends="struts-default" namespace="dynamic"
>
<!-- 请求的其实是请求得action 的name属性 -->
<action name="result" class="com.leo.struts2.ResultAction" method="execute">
<!-- 成功后进行转发 -->
<result name="success" type="dispatcher">/dynamic/index.jsp</result>
<!-- 成功后进行重定向 -->
<result name="logindirect" type="redirect">/dynamic/index.jsp</result>
<!--转发到Action 中 需要配置Actionname参数和namespace参数的值 转发时带参数的使用-->
<result name="success" type="chain">
<param name="actionName">LoginAction</param>
<param name="namespace">/</param>
<!--ognl在配置文件的使用 添加的带参数的name struts中不是默认的就会作为一个参数来处理 -->
<param name="name">${name}</param>
</result>
<!--重定向到action地址栏要发生改变-->
<result name="success" type="redirectAction">
<param name="actionName">LoginAction</param>
<param name="namespace">/</param>
</result>
</action>
</package>
<package name="Api" extends="struts-default"
>
<action name="GetApiAction" class="com.leo.struts2.GetApiAction" method="execute">
<!-- 成功后进行转发 -->
<result name="success" type="dispatcher">/struts/indexApi.jsp</result>
</action>
</package>
</struts>
结果类型有如下的这些类型:<request name="" type="">
<result name="success" type="dispatcher">/struts/indexApi.jsp</result>
type有以下类型:chain:处理Action链:
<!--转发到Action 中 需要配置Actionname参数和namespace参数的值 转发时带参数的使用-->
<result name="success" type="chain">
<param name="actionName">LoginAction</param>
<param name="namespace">/</param>
<!--ognl在配置文件的使用 添加的带参数的name struts中不是默认的就会作为一个参数来处理 -->
<param name="name">${name}</param>
</result>
dispatcher:转发:
<result name="success" type="dispatcher">/struts/indexApi.jsp</result>
redirect:重定向
<result name="success" type="redirtect">/struts/indexApi.jsp</result>
redirectAction:重定向到Action中:
<!--重定向到action地址栏要发生改变-->
<result name="success" type="redirectAction">
<param name="actionName">LoginAction</param>
<param name="namespace">/</param>
</result>