zoukankan      html  css  js  c++  java
  • servlet和struts2一起使用,实现绝对路径下的图片输出到jsp页面

    如果我们在web.xml中配置的struts2的接收请求的路径为:

    <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>

    是可以用struts2中使用servlet的,只是必须让struts2的action来转发到servlet的url-pattern中的地址就可以了。我们简单的举例如下:

    例如定义了一个servlet:

    <servlet>
    <servlet-name>Snippet</servlet-name>
    <servlet-class>com.social.util.Snippet</servlet-class>
    </servlet>

    <servlet-mapping>
    <servlet-name>Snippet</servlet-name>
    <url-pattern>/Snippet</url-pattern>
    </servlet-mapping>

    其中Snippet是显示图片的servlet,代码如下:

    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.OutputStream;

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

    public class Snippet  extends HttpServlet{
         public void doGet(HttpServletRequest req, HttpServletResponse resp)
                    throws ServletException, IOException {
        
               this.doPost(req, resp);
            }
         
         @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

             resp.setContentType("text/html; charset=UTF-8");
                resp.setContentType("image/jpeg");    //设置图片格式格式,这里可以忽略
                
                FileInputStream fis = new FileInputStream("E:/tomcat/temp/1350558335484.jpg");
                OutputStream os = resp.getOutputStream();
                
                try {
                    int count = 0;
                    byte[] buffer = new byte[1024*1024];
                    while ( (count = fis.read(buffer)) != -1 )
                        os.write(buffer, 0, count);
                } catch (IOException e){  
                   e.printStackTrace();  
        
                 }finally {
        
           if(os!=null)
        
                    os.close();
        
                    if(fis != null)
        
           fis.close();
                }
         }
        
    }

    如果你在页面中使用该servlet,则要用action转发到<url-pattern>/Snippet</url-pattern>的路径/Snippet.

    如你的页面里有个<img>元素来显示图片,使用<img src="Snippet" width="60" height="20"/>是肯定不行的,你必须定义一个action 如:

    package com.social.action;

    import com.opensymphony.xwork2.Action;

    public class GetImg implements Action{
    public String execute(){
    return SUCCESS;
    }

    }

    然后在该struts2中配置该Action

    <action name="image" class="com.social.action.GetImg">
    <result>/Snippet</result>
    </action>

    最终那个img中这么使用<img src="image" width="60" height="20"/>这样就可以用servlet了。

    在同一个项目中,如果既用到servlet又用了struts框架,运行项目时可能无法正常使用
    servlet,解决办法如下:
    该类是定义了一个过滤器,当既用到struts2有用到servlet时,
    必须用该过滤器对所有的servlet做一次过滤,否则servlet将无法正常运行。 同时在web.xml
    中,在定义struts的核心控制器前面添加该过滤器,添加代码如下:
    <filter>
    <filter-name>redisp</filter-name>
    <filter-class>filters.ReDispatcherFilter(该过滤器的类名)</filter-class>
    <init-param>
    <param-name>includeServlets</param-name>
    <param-value>所有配置的servlet名字</param-value>
    </init-param>
    </filter>
    <filter-mapping>
    <filter-name>redisp</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>

    package filters;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Arrays;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.RequestDispatcher; import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    public class ReDispatcherFilter implements Filter {
    public void destroy() {
    // TODO Auto-generated method stub
    }
    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);

    System.out.println(target);
    if(this.includes.contains(target))
    {
    RequestDispatcher rdsp = request.getRequestDispatcher(target);

    System.out.println("go..............."+rdsp);
    rdsp.forward(req, resp);
    }
    else
    chain.doFilter(req, resp);
    }
    private ArrayList<String> includes = new ArrayList<String>(); public void init(FilterConfig config) throws ServletException {

    this.includes.addAll( Arrays.asList(config.getInitParameter("includeServlets").split(",")));
    }
    }

    最终web.xml中的配置如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <servlet>
    <servlet-name>Snippet</servlet-name>
    <servlet-class>com.social.util.Snippet</servlet-class>
    </servlet>

    <servlet-mapping>
    <servlet-name>Snippet</servlet-name>
    <url-pattern>/Snippet</url-pattern>
    </servlet-mapping>

    <filter>

    <filter-name>redisp</filter-name>

    <filter-class>filters.ReDispatcherFilter</filter-class>

    <init-param>

    <param-name>includeServlets</param-name>

    <param-value>Snippet</param-value>

    </init-param>

    </filter>

    <filter-mapping>

    <filter-name>redisp</filter-name>

    <url-pattern>/*</url-pattern>

    </filter-mapping>



    <filter>
    <filter-name>struts2</filter-name>
    <!-- 指定过滤器对应的实际物理类,该类在struts2的核心代码库jar包中可以找到 -->
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    </web-app>

  • 相关阅读:
    ajax
    Django之modelform组件
    Django之form组件
    orm事务与锁
    orm之多表操作
    orm之单表操作
    Django之orm
    Django之模板系统
    Django之视图
    hdu5698瞬间移动(杨辉三角+快速幂+逆元)
  • 原文地址:https://www.cnblogs.com/zhaochunhua/p/3798704.html
Copyright © 2011-2022 走看看