如果我们在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="data: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>

servlet和struts2一起使用,实现绝对路径下的图片输出到jsp页面的更多相关文章

  1. tomcat中实现特定路径下的图片的url访问Tomcat配置图片保存路径,图片不保存在项目路径下

    使用Tomcat作为服务器的时候,如果不配置图片保存路径,将图片保存在项目路径下,那么再次打war包发布项目可能会造成图片的丢失,每次重启前将图片先保存再copy到服务器明显不方便,这时可以配置图片保 ...

  2. Web项目访问在C盘的图片(不在当前项目路径下的图片)

    使用ASPX页面处理 前台显示 <img src="/UeImg.aspx?path=C:/YxFile/ueditor/upload/image/20200211/637170508 ...

  3. 软件架构设计学习总结(18):MVC三层架构在各框架(jsp+servlet + Struts1+ Struts2+ springMVC)中的特征

    1.基于web开发中最原始的jsp+Servlet   图形化理解jsp+servlet结构: 1.从结构上分析jsp+servlet图解原理: 在基于mvc设计模式下的最原始的jsp+Servlet ...

  4. JSP页面最终是编译为Servlet执行的

    JSP页面最终是编译为Servlet执行的,你可以在Tomcat的%CATALINA_HOME%/work/Catalina/localhost中找到一个文件夹,该文件夹跟你的web-project的 ...

  5. SSH深度历险(九) Struts2+DWZ+Uploadify实现多文件(文件和图片等等)上传

    在gxpt_uas系统中,要实现文件(文件和图片等等,可以灵活配置)的批量上传至mongodb,在学习这个过程中,学习了mongodb,并实现了批量上传的功能,实现思路:在DWZ的基础上参考官方的实例 ...

  6. 基于webpack实现多html页面开发框架三 图片等文件路径替换、并输出到打包目录

    一.解决什么问题      1.图片路径替换.并输出到打包目录      2.输出目录清理 二.需要安装的包 file-loader:html.css中图片路径替换,图片输出到打包目录:命令:npm ...

  7. freemarker学习 (servlet + freemarker -> Struts2+freemarker -> springMVC+freemarker)

    什么是freemarker? freemarker类似于jsp,但不是jsp!怎么说呢?freemarker文件后缀是.ftl,它不像jsp本质是servlet,它将构建模板.解析模板.使用模板分离开 ...

  8. 自建目录中jsp页面访问servlet路径出错404

    ---恢复内容开始--- 自建目录中jsp页面访问servlet路径出错404 使用eclipse建立的项目,总是会遇到路径问题,比如jsp页面访问servlet,jsp在默认的路径.jsp在自建目录 ...

  9. Servlet转发到JSP页面的路径问题

    一.现象与概念 1. 问题 在Servlet转发到JSP页面时,此时浏览器地址栏上显示的是Servlet的路径,而若JSP页面的超链接还是相对于该JSP页面的地址且该Servlet和该JSP页面不在同 ...

随机推荐

  1. UDP 校检和和算法

    #include <Winsock2.h> #include <stdio.h> #define IP_HDRINCL 2 // Header is included with ...

  2. python学习笔记--Django入门二 Django 的模板系统

    为了使网站更干净简洁更容易维护,页面的设计和Python的代码必须分离开.我们可以使用Django的 模板系统 (Template System)来实现这种模式. 几个简单的模板标签(tag):   ...

  3. Linux学习笔记总结--CentOS 设置静态IP

    1.修改网卡配置 vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 #描述网卡对应的设备别名,例如ifcfg-eth0的文件中它为eth ...

  4. [学习笔记]设计模式之Adapter

    写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 Adapter(适配器)模式主要解决接口不匹配的问题.为此,让我们要回到最初Builder模式创建平行世界时,白雪公主和小霍比特人的谜 ...

  5. JavaScript 应用开发 #3:应用的主视图

    目前为止,我们已经在应用里面,创建了表示数据的模型,表示数据列表的集合,组织模型显示的视图与模板.下面, 我们要想办法,去把模型的列表显示在应用的界面上.这样我们就可以再去为应用创建一个主要的视图,用 ...

  6. Microsoft Visual Studio Professional 2012 专业版 下载

    记录(以下内容来自网络收集): 下载地址: https://www.microsoft.com/zh-cn/download/details.aspx?id=30682 直接iso连接下载址: htt ...

  7. Eureka Web UI URL(eureka显示主界面路径设定)

    http://stackoverflow.com/questions/30200988/spring-cloud-with-eureka-eureka-web-ui-url ************* ...

  8. jquery easyui easyui-treegrid 使用异步加载数据

    jquery easyui easyui-treegrid 使用异步加载数据 jquery easyui easyui-treegrid 异步请求 >>>>>>&g ...

  9. C#网站实现QQ第三方登陆# C#快速开发教程

    C#网站实现QQ第三方登陆 说起在网站上面可以直接使用QQ登录功能大家并不陌生.但翻其官方提供的SDK包中却没有C#方向的. 但是我们有个牛人叫张善友,做了一个民间SDK.下面我们就是用他所写的SDK ...

  10. 3、bootstrap3.0 栅格偏移 布局中的一个特产

    理解了栅格化,那么栅格偏移也相对容易理解了.v3的偏移分别有以下几种: offset:左外边距(margin-left): pull:右位移(right): push:左位移(left). 其中off ...