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

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"));

重定向同转发的区别

  1. 重定向请求两次,响应两次,转发是请求一次 响应一次
  2. 重定向浏览器中的url会变 转发不变
  3. 重定向可以跳转外部项目 , 转发只能内部
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值