问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何从response里面取出向客户端输出的html流

发布网友 发布时间:2022-04-24 22:07

我来回答

2个回答

热心网友 时间:2022-04-27 16:23

1、首先我们来创建一个类名为OutServlet的类,接下来让它继承HttpServelt类,然后重写doGet和doPost的方法。

2、然后我们在web.xml配置OutServlet的相关的信息,比如类的全路径和访问路径。

3、接下来我们在OutServlet的doGet方法中利用response对象调用getOutputStream()获取一个OutputStream的对象。然后我们来调用OutpuStream对象的write()方法输出一个字节数组,这个字节数组由中文字符串转化得来。

4、利用OutputStream这种方式输出中文有可能产生乱码。注意是有可能,而不是一定产生乱码。

5、为了让它实现无论用什么浏览器都不会乱码,我们来设置浏览器打开这个文件的编码方式;然后设置文件的编码方式。让两者的编码方式一致,它就不会乱码了。

热心网友 时间:2022-04-27 17:41

项目里需要在把servlet,jsp生成的html代码存储到数据库中。如何解决,比较直接的想法是客户端用xmlhttp,或者直接在客户端js代码里发出请求,然后把得到的html代码在作为提交数据发送给服务器端,由服务器端程序接受并存入数据库中。
但是此方法需要耗费两次网络传输,肯定性能不加,而且处理起来要几块程序同时协作才行。还是想办法从服务器端直接获取。因为从response无法直接得到输出流,得想其他的办法。一种是干脆在服务器端写一个监控socket接口的客户端程序,或者用httpunit帮助完成,就是把客户端程序移到服务器端执行。还是相对比较复杂,能不能从response入手?
答案是肯定的,采用response代理来截获response的几个输出函数,然后存储起来,已备查询。
灵感来自于前一阵一直研究的java动态代理机制(现在应用在spring的aop实现中),此处不用动态代理,就使用静态代理,proxy模式就足够了。
分别实现三个代理类:ServletResponseProxy,ServletOutputStreamProxy,PrintWriterProxy
Responseproxy 主要代码:
public class ServletResponseProxy implements HttpServletResponse {
private HttpServletResponse obj;//实际的HttpServletResponse 实例

public ServletResponseProxy(HttpServletResponse obj) {
this.obj = obj;
HtmlBuffer.cleanStr(); //情空缓存
}

//获得outputStreamProxy
public ServletOutputStream getOutputStream() throws IOException {
ServletOutputStream so = obj.getOutputStream();
ServletOutputStreamProxy sop = new ServletOutputStreamProxy(so);
return sop;
}
//获得printWriterProxy
public PrintWriter getWriter() throws IOException {
PrintWriter pw = obj.getWriter();
PrintWriterProxy pwp = new PrintWriterProxy(pw);
return (PrintWriter) pwp;
}
}

PrintWriterProxy:

public class PrintWriterProxy
extends PrintWriter {
private PrintWriter pw = null;

public PrintWriterProxy(PrintWriter pw) {
super(pw);
this.pw = pw;
}
//截获写内容写入buffer
public void write(int c) {
char a = (char) c;
String s = new String(new char[] {a});
HtmlBuffer.addStr(s);
pw.write(c);
}
}

ServletOutputStreamProxy:
public class ServletOutputStreamProxy
extends ServletOutputStream {
private ServletOutputStream obj;
public ServletOutputStreamProxy(ServletOutputStream obj){
this.obj = obj;
}
//截获写内容写入buffer
public void write(int b) throws IOException {
Integer it = new Integer(b);
HtmlBuffer.addStr(new String(new byte[]{it.byteValue()}));
obj.write(b);
}
}

由于web Httpserver 是多线程执行服务端程序,所以buffer应该分线程来存取,这样大家才能不互相干扰。所以buffer需要实现TreadLocal接口。
HtmlBuffer代码简单实现如下:
public class HtmlBuffer {
private static class HtmlInfo extends ThreadLocal {
private Map values = Collections.synchronizedMap(new HashMap());
public Object initialValue() {
return new String();
}
public String getHtmlStr() {
return (String) this.get();
}
public Object get() {
Thread curThread = Thread.currentThread();
Object o = values.get(curThread);
if (o == null && !values.containsKey(curThread)) {
o = initialValue();
values.put(curThread, o);
}
return o;
}
public void set(Object newValue) {
values.put(Thread.currentThread(), newValue);
}
}
private static HtmlInfo htmlInfo = new HtmlInfo();

public static void cleanStr(){
htmlInfo.set( "");
}
public static void addStr(String htmlStr) {
String htmlstr = (String)htmlInfo.get();
if(htmlstr == null) htmlstr ="";
htmlstr += htmlStr;
htmlInfo.set( htmlstr);
}
public static String getStr() {
return (String)htmlInfo.get();
}
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
说课包括哪些方面 说课内容包括()。 如何在手机百度上删除对话记录? 结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 减肥吃鸡蛋,蛋黄要不要吃呢? 减肥的时候,吃鸡蛋要不要吃蛋黄呢? 减肥早餐吃鸡蛋不吃蛋黄吗 减肥期间早上吃鸡蛋不能吃蛋黄吗? 我同学阿P很爱放屁,在一次上历史课的时候他放了一个响屁被老师批评,他哭了,我该怎么办? 猪蹄黄豆红烧做法 G2群嘲败者:我还在,但你们却先死了,咱们LPL还能战胜G2吗? 今年的G2和DWG相比差在什么地方? 怎样下载阿P软件我爱拼音 G2轻取GENG,G2这是等不及想和LPL战队决战于魔都之巅了吗? 黄豆红烧肉怎么做如何做好吃 DK险些不敌外卡DFM,这支队伍真的只会打野核体系吗? 阿p加入c9之后,队伍有什么比较好的提升? 在lol中的比赛,阿p和xiaohu算不算是转型比较成功的? G2整活FNC嘲讽五指不行,这次LPL会派出哪一只战队去军训G2? 亲,你们谁有孔雀开屏的图片吗?发过来吧,越多越好,谢谢了! 叶罗丽孔雀的图片 谁有孔雀的图片,要清晰的谢谢 孔雀有哪些好看的图片 孔雀是什么样子? Response.Write返回指定字符串,但却返回了html数据? 为什么.NET中AJAX的response.Text返回整个HTML页面 responseText返回整个html代码, 不知道如何解决:我想实现简单的用户名验证是否重复 清炒辣椒皮怎么做如何做好吃 response.write()返回怎么是一个网页? jquery ajax返回的页面是html该怎么解决? 当用Servlet来处理http请求并产生返回的HTML页面时,如何使HTML页面中的中文字符能够正常显示? 肉炒辣椒的做法 xmlHttp.responseText 返回的是整个网页的html,如何控制它只返回页面GridView中显示的数据 酸菜炒辣皮怎么炒好吃 水煮蛋福利来了一种做法多种吃法,怎么吃都好吃别错过 request和response还有html我快搞昏了 做法,青椒炒拉皮怎么做好吃,青椒炒拉皮的家常做法 python2.7 中 response.read()返回的是一个httpresponse对象还是一个html对象? 鸡蛋怎么吃,营养好、口感好、颜值也高? 如何用springMVC 返回一个指定的HTML页面 冬瓜皮炒辣椒的做法 html页面怎么接收执行response.getwrite.print传递的JS代码? 辣皮子炒肉的做法步骤图,辣皮子炒肉怎么做 为什么jquery ajax 返回的是整个页面的html