zoukankan      html  css  js  c++  java
  • Struts 学习之03Controller(控制器 下)

    继续学习struts ,Struts 学习之03Controller(控制器 中)
    从RequestProcess处理过后,就到了Action,那么现在看看Action!
    Action 类是用户请求和业务逻辑之间的桥梁。每个Action充当客户的一项业务代理。在RequestProcess类预处理请求时,在创建了Action实例后,就调用了自身的processActionPerform方法,该方法用action类的execute的方法
    而execute方法去调用模型的相关业务方法,完成用户所需的业务逻辑,然后把执行结果返回给视图组件,给用户显示!
    Action类在应用程序的使用过程中,为了处于线程安全的考虑,整个过程中,只会初始化一个实例对象,所有的请求线程可以同时调用他的execute方法。
    我们如果需要实现控制类,则继承action类的同时至少要实现它的execute方法。我们看一下在Struts 学习之03Controller(控制器 中) action包下的LoginAction.java类,

    package fengyan.struts.action;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
    import fengyan.struts.form.LoginForm;


    public class LoginAction extends Action {
        
        
    public ActionForward execute(ActionMapping mapping, ActionForm form,
                HttpServletRequest request, HttpServletResponse response) 
    {
            LoginForm loginForm 
    = (LoginForm) form;// TODO Auto-generated method stub
            
    //return null;
            return mapping.findForward("ok");
        }

    }

    我们可以看见他继承了Action,同时execute方法实现了!execute方法返回了一个ActionForword对象!
    ActionForword对象代表了Web资源逻辑方法对象,这里边的对象可以是jsp,servlet以及其它的action.。上面“ok”这些都是需要我们将 其配置在struts-config.xml中!如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

    <struts-config>
      
    <data-sources />
      
    <form-beans >
        
    <form-bean name="loginForm" type="fengyan.struts.form.LoginForm" />

      
    </form-beans>

      
    <global-exceptions />
      
    <global-forwards />
      
    <action-mappings >
        
    <action
          
    attribute="loginForm"
          input
    ="/login.jsp"
          name
    ="loginForm"
          path
    ="/login"
          scope
    ="request"
          type
    ="fengyan.struts.action.LoginAction">
          
    <forward
            
    name="ok"
            path
    ="/ok.jsp"
            redirect
    ="true" />
          
    <forward name="error" path="/error.jsp" />
        
    </action>

      
    </action-mappings>
    <controller processorClass="fengyan.struts.action.MyRequestProcessor">
    </controller>
      
    <message-resources parameter="fengyan.struts.ApplicationResources" />
    </struts-config>

    我们看到配置了二个forword   ok  对应 ok.jsp ,redirect=true表明其重导向!另外一个是error 对应 error.jsp,不需要重导向!
    当然也可以不在配置文件中配置这些信息,那么我们就需要在action类中的直接return,方式如下:

    return new ActionForword("eflylab","eflylab.jsp",true);
    //第一个eflylab是逻辑名称,中间eflylab.jsp为物理地址,最后true 是指其跳的方式是Redirect还是forword,true为重导向!false不 需要重导向!

    其实我们看到,在struts-config.xml中配置后,然后再在action中使用是非常方便的!而且也比较灵活!

    最后再介绍一个action子类,也是比较常用的一个内置对象DispatchAction.
    DispatchAction是干什么用的呢,就是我们实际中正常的一个请求,例如后台管理,可能是增加数据,或修改,删除,那么这些请求,我们知道都是统一发到ActionServlet,然后actionServlet就发送给相对的action处理,这时就需要三个action!而更多时候我们是选择三个 操作请求同时对一个formBean进行操作的,我们就不需要太多的action,只 需要一个action,当然,这样也可以在action的execute方法中进行判断来解决,但不是十分方便!
    那么这个时候我们就要用到DispatchAction,看一下如何使用,我们将先前的LoginAction.java类改为如下:
    package fengyan.struts.action;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
    import org.apache.struts.actions.DispatchAction;

    import fengyan.struts.form.LoginForm;

    //我们将 该 类由继承自Action 改为继承 DispatchAction
    //DispatchAction是Action的子类!
    public class LoginAction extends DispatchAction {
        
    /*需要注意的是,如果我们的action类继承自DispatchAction,那么该类中
        不能存在execute,我们要将 其名改掉,具体可以改为我们需要的方法名,
        如,本例中我们改为如下
    */

        
    public ActionForward add(ActionMapping mapping, ActionForm form,
                HttpServletRequest request, HttpServletResponse response) 
    {
            LoginForm loginForm 
    = (LoginForm) form;// TODO Auto-generated method stub
            System.out.println("接收到的是增加操作请求!");
            
    return mapping.findForward("ok");
        }

        
    //还可以增加任意多个我们需要的方法!
        public ActionForward update(ActionMapping mapping, ActionForm form,
                HttpServletRequest request, HttpServletResponse response) 
    {
            LoginForm loginForm 
    = (LoginForm) form;// TODO Auto-generated method stub
            System.out.println("接收到的是更新操作请求!");
            
    return mapping.findForward("ok");
        }

    }

    我们看到上面二个方法内部其实还是和execute方法一样,唯一不同就是方法名字!那么究竟如何知道请求呢,我们当然还要改一下配置文件struts-config.xml! 在action中添加一个属性parameter
    <action-mappings >
        
    <action
          
    attribute="loginForm"
          input
    ="/login.jsp"
          name
    ="loginForm"
          path
    ="/login"
          parameter
    ="doWhat"
          scope
    ="request"
          type
    ="fengyan.struts.action.LoginAction">
          
    <forward
            
    name="ok"
            path
    ="/ok.jsp"
            redirect
    ="true" />
          
    <forward name="error" path="/error.jsp" />
        
    </action>
    我们加的parameter值 为 doWhat.。这时还没完成,我们还需要修改前台页面,login.jsp
    <html> 
        
    <head>
            
    <title>JSP for LoginForm form</title>
        
    </head>
        
    <body>
            
    <html:form action="/login">
                userName : 
    <html:text property="userName"/><html:errors property="userName"/><br/>
                userPwd : 
    <html:password property="userPwd"/><html:errors property="userPwd"/><br/>
                
    <html:submit/><html:cancel/>
            
    </html:form>
        
    </body>
    </html>

    将<html:form action="/login">修改如下:
    <html:form action="/login?doWhat=add">
    这里的doWhat就是我们刚刚在action中添加的参数paramter的值!而add则就是actionform中的add方法名!
    现在看下运行结果!


    我们看到单击submit后 控制台显示出了相应的信息,而同时再将<html:form>标记改为
    <html:form action="/login?doWhat=update">

    运行的结果为:


    在控制台打印出更新,由此可见,使用DispatchAction我们可以很方便的实现多个不同请求使用同一个actionform了!
    好了 基本的都写的差不多了,至于说到具体的与数据库的操作,现在还不想写,这些都是以后与Hibernate一起使用的。到时再写了~
  • 相关阅读:
    RE
    【LeetCode】198. House Robber
    【LeetCode】053. Maximum Subarray
    【LeetCode】152. Maximum Product Subarray
    【LeetCode】238.Product of Array Except Self
    【LeetCode】042 Trapping Rain Water
    【LeetCode】011 Container With Most Water
    【LeetCode】004. Median of Two Sorted Arrays
    【LeetCode】454 4Sum II
    【LeetCode】259 3Sum Smaller
  • 原文地址:https://www.cnblogs.com/eflylab/p/601856.html
Copyright © 2011-2022 走看看