structs2中已经定义了servlet,我们创建自己的servlet时该如何使用

    在Structs2中已经定义了Servlet,有些时候我们不需要再去写Servlet,但众所周知,Servlet 通过创建一个框架来扩展服务器的能力,以提供在 Web 上进行请求和响应服务,有时候我们还是需要自己来定义我们的Servlet,我们需要用一个Action来转发自己的servlet,关于Servlet的使用我们有以下两种方法:
1、在servlet名称后面加上.servlet
统一在servlet后面加上.servlet结尾(包括web.xml配置文件中和页面上使用servlet的地方),比如web.xml中配置如下:    
<servlet-mapping>      
    <servlet-name>NewServlet</servlet-name>      
    <url-pattern>/New.servlet</url-pattern>    
</servlet-mapping>
2、使用Action来转发
我们在使用Structs2的时候,需要对web.xml文件进行配置,在配置文件时我们会把<url-pattern>设置为/*,这样设置的时候所有的请求都会经过struts2,那么只要经过struts2就必须得有action与之对应,否则就会报错。所以在view层的jsp代码中直接访问/xxx/servlet/test就会报错找不到action,此处的<url-pattern>内的内容需要和structs.xml中<result>配置相同。
对于这种情况,我们只需要写一个action并在struts.xml文件中进行配置即可:
public class NewAction implements ActionSupport {   
    public String execute(){   
        return "成功";   
    }   
}   
在structs.xml中的配置如下:
<package name="test" namespace="/" extends="struts-default">   
  ....   
  <action name="test" class="com.xxx.action.NewAction">   
      <result>/servlet/test</result><!--result配成servlet的url-pattern即可-->   
  </action>   
  ....   
</package>   
3、给Action添加后缀(常用)
如果不想改变前台jsp页面的访问地址,只能改变web.xml中的配置,原先struts2的<url-pattern>设置为/*会拦截所有的请求,包括访问servlet,现在可以将struts2的<url-pattern>改成 *.action,那么struts2会拦截所有后缀是 .action的请求,其他的就不会拦截了。这样的话,前台就可以直接访问/servlet/test了。不过访问struts2的url中必须都以 .action结尾,这样才能被struts2拦截到。
4、使用filter过滤servlet
①新建一个filter用于过滤servlet
public class ReDispatcherFilter implements Filter {       
    private ArrayList<String> includes = new ArrayList<String>();      
    @Override  
    public void destroy() {       }       
    @Override       
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain
        chain) throws IOException, ServletException {          
        HttpServletRequest request = (HttpServletRequest) req;         
        String target = request.getRequestURI();           
        target=target.lastIndexOf("?")>0?  
           target.substring(target.lastIndexOf("/")+1,target.lastIndexOf("?")-
           target.lastIndexOf("/")):target.substring(target.lastIndexOf("/") + 1);
        if (this.includes.contains(target)) {               
            RequestDispatcher rdsp = request.getRequestDispatcher(target);
            rdsp.forward(req,resp);          
         }else               
            chain.doFilter(req, resp);      
     }       
     @Override       
     public void init(FilterConfig config) throws ServletException {
this.includes.addAll(Arrays.asList(config.getInitParameter("includeServlets").spl       it(", ")));      
     } 
}
②在web.xml中做适当配置,在struts2的配置前加上下面的代码: 
<filter>     
    <filter-name>redisp</filter-name>     
    <filter-class>com.kcjxkj.filter.ReDispatcherFilter</filter-class>    
    <init-param>       
        <param-name>includeServlets</param-name>      
        <param-value>ValidateEmail</param-value>    
    </init-param>   
</filter>    
<filter-mapping>     
    <filter-name>redisp</filter-name>    
    <url-pattern>/*</url-pattern>   
</filter-mapping>  
其中,<param-value></param-value>中为web.xml中配置的要过滤的servlet名,多个之间用","逗号隔开。

猜你喜欢

转载自zhangjingkun.iteye.com/blog/2327852