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="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>
转载于:https://www.cnblogs.com/zhaochunhua/p/3798704.html
servlet和struts2一起使用,实现绝对路径下的图片输出到jsp页面相关推荐
- HttpHandler:给指定路径下的图片添加水印显示
圣诞节,25日,要交ACCP5.0认证的项目,其中有这样一个要求:书店的所有图书的封面放在了\images\convers\下面,要求所有引用这一路径下的图片都添加书店的店名水印图片.就是说拦截Htt ...
- cv2.imread无法读取/保存中文路径下的图片的解决方法
cv2.imread无法读取/保存中文路径下的图片的解决方法 关于无法读取 用cv2.imread读取中文路径下的图片会出现空.这种情况下windows会出现,mac好像还没出现过. 解决方法是,使用 ...
- java 图片的路径_【JAVA技术】如何展现绝对路径下的图片
问题描述:通常情况下,我们在jsp页面上要想显示图片,直接用html的标签即可,但是img标签的src属性的值为图片存放的相对地址.如果图片文件没有存放在整个工程中,此时就需要访问图片文件的绝对路径, ...
- tomcat中实现特定路径下的图片的url访问Tomcat配置图片保存路径,图片不保存在项目路径下...
使用Tomcat作为服务器的时候,如果不配置图片保存路径,将图片保存在项目路径下,那么再次打war包发布项目可能会造成图片的丢失,每次重启前将图片先保存再copy到服务器明显不方便,这时可以配置图片保 ...
- jsp显示服务器路径下的图片,jsp 从服务器获取图片路径
jsp 从服务器获取图片路径 内容精选 换一换 批量获取智能图片下载路径POST /v1/{user_id}/intelligence-data/pictures状态码: 200状态码: 400获取图 ...
- javaweb利用servlet与struts2实现可点击刷新的基础图片验证码
javaweb利用servlet实现图片验证码 验证码是登录验证的技术,可以一定程度防止恶意脚本刷网站,造成服务器压力. 具体实现思想很简单: 首先利用servlet产生一个随机的验证码, 保存在se ...
- java 显示服务器的图片,【JavaWeb】实现读取本地服务器路径下的图片
Servlet层代码: package com.ysw.demo; import javax.servlet.ServletException; import javax.servlet.Servle ...
- OpenCV C++ imread填写路径下有图片却读不出 求助!!!!!!
求助!!如图!! 网上说的那种Debug和release的情况我也试过了 怎样都读不进图片真的让人崩溃= = 情况更新 我把图片换一个目录下存放就可以读到了,但是没找出目录和目录的区别. 同一个目录下 ...
- vue background-image路径下的图片打包后找不到的问题
参考 https://segmentfault.com/q/1010000009700735 的解决办法.
最新文章
- Linux的简单Nginx
- java finally块_java finally块后的语句是否要执行
- [js]promise学习2
- ecshop快速购买
- springboot 整合springsecurity
- 广告关闭php,电脑右下角的广告怎么去掉
- 计算机网络战队名称大全,响亮的战队名字大全,吓到敌人了!
- 为你的简书和 GitHub 设定个性域名 1
- python 100天 pdf 最新版_GitHub - Nolan2018/Python-100-Days: Python - 100天从新手到大师
- 短信系统实现原理(基于redis)
- 贪婪洞窟2 素材解密
- 股票指标 PHP,怎样将股票指标改为选股指标
- 11G新特性 -- archival(long-term)backups
- 信源编码作业【01】利用Audacity软件语音信号的频谱分析
- 找个程序员做老公,最靠谱!
- 导数公式(1)-基本求导公式
- Maven | 05.Maven项目结构及Maven命令
- 网络测试工具netperf介绍
- 【产品时评】微信的堕落
- MTPuTTY配置ssh连接Gitlab