您的位置:首页 > 产品设计 > UI/UE

ServletContext介绍 ,request response中文乱码问题

2017-08-06 18:02 471 查看

ServletContext介绍

当Web项目被部署到Tomcat的时候就会创建一个ServletContext对象,而且这个对象生命的周期是伴随者整个Web项目,同android的ApplicationContext的功能是一致,可以用来存储数据,在任何的一个Servlet都可以随时去调用

API的介绍,路径问题

用来存取数据的

 void setAttribute(String name,Object value); —-向ServletContext域中存放数据

 Object getAttribute(String name); —-从ServletContext域中获取数据

 void removeAttribute(String name); —-从ServletContext域中移除数据

去读配置文件

 InputStream getResourceAsStream(String path); —-将一个文件转换成输入流

 String getRealPath(String path); —-获取某个文件的磁盘绝对路径

当资源文件放到Web项目的src目录下,最终会被部署到Tomcat的/WEB-INF/classes/db.properties路径下

Properties properties = new Properties();

String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties"); //返回的磁盘路径包括C盘符 D盘符的。。

//InputStream resourceAsStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");  读取配置文件的方式

System.out.println(path);
InputStream is = new FileInputStream(path);
properties.load(is);
String username = properties.getProperty("username");
String password = properties.getProperty("password");


Request对象

request对象内部封装了 请求行 请求头 请求体的内容 通过API去操作对应内容,无技术含量

ServletRequest(接口)–>HttpServletRequest(接口)–>HttpServletRequestWrapper(实现类)

Request提交中文请求post get 乱码问题解决

产生的原因

提交汉子产生的乱码的源码是因为浏览器在编辑汉子是使用ISO88591进行编码,这套编码不支持中文,TomCat也是采用ISO88591进行解密的所有需要在servlet用service方法中讲提交过来的数据按照utf-8进行解密;

Get方式乱码解决 ( 2种 )

**方式一:**
// get方式解决中文乱码
// String username = new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8");

**方式二 : URLEncoder和URLDecoder


Post方式乱码解决

因为post方式,提交的数据都tomcat的缓存区中,默认缓存区是按照ISO9951进行编码

request.setCharacterEncoding("UTF-8");   //设置缓存器编码


Response提交中文请求post get 乱码问题解决

服务端想浏览器响应数据封装的一个对象

API介绍

响应行部分

void setStatus(int sc);

响应头部分

void setHeader(String name,String value);

void addHeader(String name,String value); 添加请求头

响应体部分

ServletOutputStream getOutputStream();

PrintWriter getWriter(); //字节流 字符流不可以同时使用,输入的标签可以被解析

void sendRedirect(String location) //location 项目名/action

void addCookie(Cookie cookie);

void setCharacterEncoding(String encoding);

void setContentType(String type);

重定向路径问题

路径有两种 客户端路径 服务端路径

如果要定向到外部服务端需要加全路径 ,如果重定向到服务器内部可以不用加项目名称

response.sendRedirect(“/ruirui/ResponseDemo2”);

响应中文编码问题

response.setContentType(“text/html;charset=UTF-8”); //设置浏览器解析时编码

定时跳转

response.setContentType("text/html;charset=UTF-8");
response.getWriter().println("你好");
response.setHeader("Refresh", "5;url=file:///E:/Code/PP/servlet/demoServlet/WebContent/WEB-INF/repose.html");


响应字节流 字符流中文乱码问题

输出字符流 乱码问题

当响应种含有中文一定会出现中文乱码问题

1 字符流缓冲区 默认是ISO8859编码 支持中文,需要设置缓冲区编码为utf-8

2 浏览器默认也是ISO8859编码 支持中文,

因此需要同时去设置两个区域的编码

设置浏览器默认打开的时候采用的字符集的编码:
response.setHeader("Content-Type", "text/html;charset=UTF-8");
设置response的缓冲区的编码:
response.setCharacterEncoding("UTF-8");

可以简写response.setContentType("text/html;charset=UTF-8");


输出字节流乱码问题

不一定会产生乱码问题 关键看浏览器是用什么来解密 ,

因此需要设置浏览器的编码,还有字节流转二进制要设置为utf-8编码

// 设置浏览器默认打开的时候采用的字符集的编码:
response.setHeader("Content-Type", "text/html;charset=UTF-8");
// 设置中文转字节数组的时候采用的编码
response.getOutputStream().write("中文".getBytes("UTF-8"));


重定向同转发的区别

重定向请求两次,响应两次,转发是请求一次 响应一次

重定向浏览器中的url会变 转发不变

重定向可以跳转外部项目 , 转发只能内部
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: