Fork me on GitHub

Response Request

注意:所有文章除特别说明外,转载请注明出处.

1.response

1.输出数据

程序以什么码表输出,就需要控制浏览器以什么码表打开,所以有两种方式控制浏览器以什么码表打开页面:

1.response.setHeader("Content-type","text/html;charset=utf-8");//设置网页显示打开的的编码方式
2.response.setContentType("text/html;charset=utf-8");//默认调用setHeader和setCharacterEncoding

注意:使用HTML技术中的标签可以模拟一个http响应头 <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>

注意:response可以使用setCharacterEncoding方法设置码表。字符流输出:PrintWritet->response->浏览器,response->浏览器默认使用iso-8859编码。

2.文件下载

1.首先使用ServerContext的getRealPath()方法,然后再使用InputStream和OutputStream流类文件进行文件下载操作,同时需要注意,当下载文件是中文名,那么需要经过URL编码URLEncoding.encode进行编码。

3.随机图片

1.使用BufferedImage在内存生成图片,再使用ImageIO输出。2.画图使用Graphics,旋转使用Graphics2D。3.汉字的区间:\u4e00-\u9fa5 。

4.刷新与缓存

1.刷新:使用刷新操作,一般我们不在servlet里加refresh头,而是在jsp中加入<meta>头模拟。
2.缓存:加入expires头,当前时间+要缓存的时长

5.请求重定向

1.重定向:只需要设置状态码和 location 头,或者直接使用response的setRedirect方法,向服务器两次请求。浏览器会改变地址栏,一般使用于登录、购物等场景。

2.转发:调用ServletContex对象的getRequestDispatcher方法,再调用forward方法。向服务器一次请求,浏览器地址栏不变。

注意:1.getOutputStream和getWriter方法跟别用于输出二进制数据、输出文本数据的ServletOutputStream、Printwriter对象,这两个方法相互排斥,只能调用其中一个,否则抛IllegalStateException异常。2.response的输出流会自己关闭。Servlet的service方法结束后,Servlet引擎会检查并调用close方法关闭该输出流对象。

2.request

1.两个名词解释:

1.URI:标识某个资源
2.URL:标识互联网上某个资源

2.方法:

1.getRequestURI用于权限拦截,访问统计
2.getRemoteAddr用于得到客户机IP地址
3.getMethod得到客户机请求方式

3.request对象获取数据的四种方式:

1.getParameter
2.getParameterNames
3.getParameterValues
4.getParameterMap(可结合JavaBean使用) (getInputStream用于文件上传)

4.中文乱码:

URL后面如果有中文数据,需要编码后再提交。表单提交的数据使用的码表和该页面的码表一致,而getParameter方法默认使用ISO-8859码表。

解决方案:

1.对于post提交的数据,在获取数据前要使用request对象的setCharacterEncoding设置码表。
2.对于get提交的数据,只能手工解决。先对数据调用getBytes("ISO-8859-1")获取二进制字节,再用特定码表构建字符串。
3.超链提交的中文,解决办法同get提交的数据。

或者可以通过改服务器配置来解决乱码问题,但一般不建议使用。

1.URIEncoding:改tomcat的配置文件conf/server.xml的连接器<Connector>中的URIEncoding属性

2.useBodyEncodingForURI:将conf/server.xml的连接器<Connector>中的useBodyEncodingForURI置为true

5.请求转发(应用场景:mvc设计模式)

model : javabean;
view : jsp;
controller : servlet

使用request域对象把数据带给转发资源。调用request对象的getRequestDispatcher方法,再调用forward方法。一次请求,浏览器地址栏不变。

forward 细节

1.不能在关闭输出流后再调用转发,也不能调用两次,否则会抛出异常。
2.跳转之前会清空response中的数据。即数据只是写入到缓冲区而没真正输出到客户端,则可调用forward方法,原来写入到缓冲区的内容被清空,但响应头字段信息保持。
3.include方法可以用于包含一些公共页面(一般不在servlet中包含)

6.地址的写法

以斜杠/开头。如果是给服务器用,则/代表当前web应用;如果给浏览器用,则/代表网站。

例子:目录结构如下

mail---------------------------Web应用所在目录
           |----form1.html
           |----WEB-INF目录
                    |---------classes目录
                    |---------lib目录
                    |---------web.xml

request.getRequestDispatcher("/form1.html")
response.sendRedirect("mail/form1.html")
this.getServletContext().getRealPath("/form1.html")
this.getServletContext().getResourceAsStream("/form1.html")
<a href="/mail/form1.html">
<form action="/mail/form1.html">
其中,1,3,4是给服务器用;2,5,6是浏览器用

7.防盗链

读取referer请求头,不合要求则重定向。

本文标题:Response Request

文章作者:Bangjin-Hu

发布时间:2019年10月15日 - 09:22:26

最后更新:2020年03月30日 - 08:02:38

原始链接:http://bangjinhu.github.io/undefined/request response/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Bangjin-Hu wechat
欢迎扫码关注微信公众号,订阅我的微信公众号.
坚持原创技术分享,您的支持是我创作的动力.