Strurs扩展总结

1.Struts框架中控制器组件的类

  ①ActionServlet类:(接收客户端的请求,将请求转发给RequestProcessor类去做处理)

             javax.servlet.http.HttpServlet
                           ↓继承
         org.apache.struts.action.ActionServlet

         方法:

         doGet(HttpServletRequest request,HttpServletResponse response)
         {
             process(request,response);
         }

         doPost(HttpServletRequest request,HttpServletResponse response)
         {
             process(request,response);
         }

         //★process()
         protected void process(HttpServletRequest request,HttpServletResponse response)
         {
             //在此方法中将调用RequestProcessor类中的process()方法
         }                                                                                                                                                                                                                                                                                                   

 

  ②RequestProcessor类:(接收ActionServlet类发送过来的请求,封装Form表单中的数据到ActionFrom,调用Action类去做处理,并且
                         接收Action做完处理后的ActionForward返回值,通过ActionForward进行跳转)

         RequestProcessor类中会调用一系列的方法:
                 processLocale()      为请求选择一个语言环境
                 processContent()      为所有响应设置默认的内容类型(如有必要)
                 processPopulate()      填充与请求关联的 ActionForm
                 processInclude()      将调用路径的结果包括在请求中
                 processActionCreate()      实例化当前 ActionMapping 指定的类的实例
                 processActionPerform()      将调用 action 的 perform() 或 execute() 方法
                 processPath()              确定选择将要处理的动作的路径
                 processMapping()      为请求选择动作映射
                 processRoles()              检查用户的角色是否允许其访问请求的资源
                 processActionForm()      新建一个 Form Bean 或从请求会话中检索 Form Bean
                 processForward()      处理 <action-mapping> 元素的 forward 以匹配当前的请求路径
                 processValidate()      调用 Form Bean 的 validate() 方法
                 processPreprocess()      告诉请求处理器调用此方法后是否应继续处理请求(★我们一般可以重写此方法达到
                                                                                           自定义转发请求的目的)


  ③Action类:(通过ActionForm参数获取表单中的值,调用javaBean做业务处理,返回ActionForward)

        public ActionForward execute(ActionMapping actionMapping,
                                           ActionForm actionForm,
                                           HttpServletRequest servletRequest,
                                           HttpServletResponse servletResponse)
               {
                  ...  ...
               }
       

  ④ActionMapping类:
  ⑤ActionForward类:

 

2.对控制器进行扩展有三种方式

 ①修改ServletAction(这种方式并不推荐所以省略)

 ②重写RequestProcessor类(配置struts-config.xml文件的<controller>子标签)

 ③可以采用插件的方式对控制器进行扩展(配置struts-config.xml文件的<plug-in>子标签)


  一.重写RequestProcessor类:
      说明:
      RequestProcessor类是请求处理类,所有的客户端请求都是由此类处理,所以可以自定义类继承自
      org.apache.struts.action.RequestProcessor类,并且重写
      public boolean processPreprocess(HttpServletRequest request,HttpServletResponse response)方法,以此来达到自定义
      处理请求的目的。一般像程序的加密解密,对客户端的请求做过滤处理,获取对某些字符串的特殊处理,都可用此方法。

      第一步:自定义类,继承至org.apache.struts.action.RequestProcessor。
              重写public boolean processPreprocess(HttpServletRequest request,HttpServletResponse response)方法
          例如:

          package action;
          import org.apache.struts.action.RequestProcessor;
          import javax.servlet.http.*;

          public class MyRequestProcessor extends RequestProcessor
          {
                 //重写public boolean processPreprocess(HttpServletRequest request,HttpServletResponse response)方法
      public boolean processPreprocess(HttpServletRequest request,HttpServletResponse response)
   {
       this.servlet.getServletContext().setAttribute("key", "value");//可以将值存储在全局变量里面(Application)
       
                        boolean flag=false;//定义返回值变量
       String host=request.getRemoteHost();//通过request对象获取客户端请求的地址
       if(!host.startsWith("127."))//判断地址是否不是以127.开头的(一般本机地址的IP是127.0.0.1)
                        {
        flag=true;//★返回值为true,表示将请求向下继续传递,反之为false,则程序停止传递。从而达到自定义控制的作用
                        }
       else
                        {
        try
                                {
             response.sendRedirect("error.jsp");         
        }
        catch(Exception e)
                                {
            e.printStackTrace();
               }
              }
                
                        return flag;
          }
          }

          说明:这里是在判断客户端的请求,是否是自己本机的IP地址,如果是的话这跳转到error.jsp页面,否则则按照原定的跳转路径跳转
                这里的返回值起到关键作用,true,表示将请求向下继续传递,为false,则程序停止传递。
     


    第二步:修改配置struts-config.xml文件的<controller>子标签,告诉程序,这里有自定义的控制。  

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

             <global-exceptions />
             <global-forwards />
             <action-mappings >
                 <action
                    attribute="loginForm"
                    input="/login.jsp"
                    name="loginForm"
                    path="/login"
                    scope="request"
                    type="action.LoginAction">
                 <forward name="failure" path="/failure.jsp" />
                 <forward name="success" path="/success.jsp" />
                 </action>
             </action-mappings>

             <controller processorClass="action.MyRequestProcessor"></controller>★★★★
             <message-resources />
           </struts-config>

         说明:
            <controller processorClass="action.MyRequestProcessor"></controller>这里就在做配置,告诉程序对程序的请求处理将由
            action/MyRequestProcessor.java去执行。

 

  二. 使用插件的方式对控制器进行扩展

        插件的原理是在WEB服务启动的时候,(例如:TomCat启动的时候) ,会通过struts-config.xml配置文件加载相应的文件或资源到项目中。
        例如,Spring的加载文件等,这有个好处就是,程序会在服务启动时就已经加载完毕,这样不会占用太多的资源,但是他由于只加载一次,
        所以,不能动态的修改资源文件,例如对属性文件的修改。

        第一步:自定义类实现org.apache.struts.action.PlugIn接口,PlugIn接口中有两个方法:
               ①public void init(ActionServlet servlet, ModuleConfig conf)throws ServletException;
                    此方法在服务启动的时候会自动被WEB服务调用。一般做加载资源处理,而且只执行一次。

               ②public void destroy( );
                    此方法在服务停止的时候会自动调用,一般做释放资源。

               例如:
                package action;

  import org.apache.struts.action.PlugIn;
  import javax.servlet.ServletException;
  import org.apache.struts.config.ModuleConfig;
  import org.apache.struts.action.*;

  public class MyPlugIn implements PlugIn//实现PlugIn接口
                {
    private String customData;     
    public void setCustomData(String key) {
     this.customData = key;
   }  


                        //init方法★★★★
    public void init(ActionServlet servlet, ModuleConfig conf)throws ServletException {    
     servlet.getServletContext().setAttribute("hello",customData);//将值存入全局变量中(Application) 
       }  
                       
                        //destroy方法★★★★
    public void destroy( )
                        {     
  
   } 
  }


                说明:
                      这里的init方法是将customData属性存储到全局变量中(业务逻辑比较简单,只是为了演示),一般的情况下,
                      这里都是做读取资源文件的操作,例如对外部属性文件的操作,对属性文件的操作是通过ModuleConfig参数执行的。
                     

         第二步:配置struts-config.xml文件的<plug-in>子标签,制定资源文件的物理位置
               
                例如:
                     
  <struts-config>
       <data-sources />

       <form-beans >
       <form-bean name="loginForm" type="form.LoginForm" />
                   </form-beans>
 
                   <global-exceptions />
       <global-forwards />
    
                   <action-mappings >
           <action
         attribute="loginForm"
         input="/login.jsp"
         name="loginForm"
          path="/login"
         scope="request"
          type="action.LoginAction">
               <forward name="failure" path="/failure.jsp" />
               <forward name="success" path="/success.jsp" />
            </action>
       </action-mappings>
                  
                   <message-resources parameter="ApplicationResources" />
      
                   <plug-in className="action.MyPlugIn">★★★
       <set-property property="customData" value="Hello from the plugin" />★★★
       </plug-in>
  </struts-config>


                说明:
                   <plug-in className="action.MyPlugIn">★★★
       <set-property property="customData" value="Hello from the plugin" />★★★
       </plug-in>
                   这里就是对资源文件的说明,表示说WEB服务启动的时候会调用action/MyPlugIn.java的init()方法进行资源加载或对资源
                   文件的一系列的操作,加载的文件内容是Hello from the plugin,文件的映射名称为customData。
                   注意:这里的文件映射名与action/MyPlugIn.java中的属性名相同,这里是给属性赋值,一般的情况是:
                        <set-property property="customData" value="WEB-INF/*.properties" />
                        那样的话,就是将WEB-INF目录下的某个属性文件加载到程序中,而只要通过init()方法中的ModuleConfig参数
                        对属性文件进行操作就可以了。

 

 

****************************************************************************************************************************

  附加:
      在struts-config.xml配置文件中的配置信息包括一下几个:(他们的顺序不能颠倒)
     

      ==============================================================================
      ①<datasource>:配置数据源,通过此配置可连结到数据库。

         <data-sources>
            <data-source key="Sql"  type="org.apache.commons.dbcp.BasicDataSource">
              <set-property property="driverClassName"  value="sun.jdbc.odbc.JdbcOdbcDriver" />
              <set-property property="url"  value="jdbc:odbc:accp" />
              <set-property property="username" value="" />
              <set-property property="password" value="" />
            </data-source>
         </data-sources>
        注意:这里用的是桥连

        //在程序中获取数据库的连接
        ServletContext context = servlet.getServletContext();//获取上下文对象
        DataSource dataSource =(DataSource) context.getAttribute("Sql");//获取数据源对象
        Connection conn = dataSource.getConnection();//获取数据库连接对象
        ...   ...   ...  

      ==============================================================================
      ②<form-bean>:配置ActionForm★(省略)

      ==============================================================================
      ③<global-exception>:配置全局性的异常(一般很少配置)
        
          该元素主要配置异常处理,它的exception子元素代表全局的异常配置。struts采取配置的方式来处理异常。
          它用来设置java异常和异常处理类org.apache.struts.action.ExceptionHandler之间的映射。它有七个属性,如下所示:
        1.   className:指定和exception元素对应的配置类,默认为:org.apache.struts.config.ExceptionConfig。可有可无。
        2.   Handler:指定异常得理类,默认为:org.apache.struts.action.ExceptionHandler。可有可无
        3.   key:指定在Resource   Bundle中描述该异常的消息key
        4.   path:指定当异常发生时的转发路径。
        5.   scope:指定ActionMessages实例的存放范围,可选值包括:request和session,默认为request。可有可无。
        6.   type:指定所需处理异常类的名字,必须。
        7.   bundle:指定Resource   Bundle
          如下所示:
            <global-exceptions>
             <exception  
            key= "global.error.invalidlogin "
            path= "/error.jsp "
            scope= "request "
            type= "struts.sample.capl.sample3.Exception.InvalidiNameException " />
             </global-exceptions>


      ==============================================================================
      ④<global-forwards>:配置全局性的跳转(一般很少配置)

           该元素主要用来声明全局的转发关系,它具有以下四个属性:
         1.   className:和forward元素对应的配置类,默认为:org.apache.struts.action.ActionForward。可有可无。
         2.   contextRelative:此项为true时,表时path属性以"/"开头,相对于当前上下文的URL,默认为false.可有可无。 
         3.   name:转发路径的逻辑名.必填。
         4.   path:转发或重定向的URL,当contextRelative=false时,URL路径相对于当前应用(application),当为ture时,表示URL路径相对于当前上下文(context)。
         5.     redirect:当此项为ture时,表示执行重定向操作。当此项为false时表示转向操作。默认为false。
           如下所示:
             <global-forwards>
               <forward     name= "forms1 "     path= "/a.do "/>
               <forward     name= "forms2 "     path= "/nb.jsp "/>
             <global-forwards>

      ==============================================================================
      ⑤<action-mapping>:配置Action以及要跳转的页面的映射情况★(省略)
     
      ==============================================================================
      ⑥<controller>:用于配置ActionServlet属性

           bufferSize 指定上载文件的输入缓冲的大小。该属性为可选项,默认值为4096. 
           className 指定和<controller>元素对应的配置类。默认为org.apache.struts.config.ControllerConfig. 
           contentType 指定响应结果的内容类型和字符编码。该属性为可选项,默认值为text/html。
                      如果在Action和JSP网页中也设置了内容类型和字符编码,将会覆盖该设置。 
           locale 指定是否把Locale对象保存到当前用户的Session中。默认值为false. 
           processorClass 指定负责处理请求的Java类的完整类名。默认值为org.apache.struts.action.RequestProcessor。
                         如果把此项设置为自定义的类,那么应该保证该类扩展了org.apache.struts.action.RequestProcessor类。 
           tempDir 指定处理文件上传的临时工作目录。如果此项没有设置,将采用Servlet容器为Web应用分配的临时工作目录。 
           nochache 如果为true,在响应结果中将加入特定的头参数 :Pragma, Cache-Control和Expires,
                      防止页面被存储在客户浏览器的缓存中。默认值为false.


           如果应用包含多个子应用,可以在每个字应用的Struts配置文件中配置<controller>元素。
                     这样,尽管这些子应用共享同一个ActionServlet对象,
                     但是他们可以使用不同的RequestProcessor类。★★★★★

           以下是<controller>元素的配置代码示例:
           <controller  contentType="text/html;charset=UTF-8"  locale="true"  processorClass="CustomRequestProcessor"/>


      ==============================================================================
      ⑦<message-resource>:配置资源信息

           主要配置本地化消息文本,它具有以下属性。
         1.   className:和message-resources元素对应的配置类,默认为org.apache.struts.config.MessageResourcesConfig。
         2.   factory:指定消息资源的工厂类,默认为:org.apache.struts.util.PropertyMessageResourcesFactory类
         3.   key:指定Resource   Bundle存放的ServletContext对象中时采用的属性Key,
                默认由Globals.MESSAGES_KEY定义的字符串常量,只允许一个Resource   Bundle采用默认的属性Key。
         4.   null:指定MessageSources类如何处理未知消息的key,如果为true,则返回空字符串,
                      如果为false,则返回相关字串,默认为false
         5.   prameter:指定MessageSources的资源文件名,如果为:a.b.ApplicationResources,
                则实际对应的文件路径为:WEB-INF/classes/a/b/ApplicationResources.properties.
           如:
             <message-resources   null= "false "   parameter= "defaultResource "/>
             <message-resources   key= "num1 "   null= "false "   parameter= "test "/>
           访问为:
             <bean:message     key= "zxj "/>
             <bean:message     key= "zxj "     bundle= "num1 "/>
           其中,zxj表法,messagesource资源文件中的一个字符串。

      ==============================================================================
      ⑧<plug-in>:配置插件信息
           配置Struts的插件,属性如下:
         1.   className:指定的Struts插件类,必须实现org.apache.struts.action.PlugiIn接口。
           如:
             <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
               <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
             </plug-in>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值