当前位置: 代码迷 >> 综合 >> sturts2(二)
  详细解决方案

sturts2(二)

热度:20   发布时间:2023-11-01 15:00:31.0

模型

目录

模型

拦截器:  

结果类型:    


域模型

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>