乱码问题-页面跳转方式-Servlet配置文件
1.HttpServletRequest
a)HttpServletRequest是一个接口,继承了ServletRequest接口;
b)HttpServletRequest对象由服务器创建,并作为参数传递给service方法,用于给Servlet提供客户端的请求信息。
c)获取请求行信息:
private void getReqLine(HttpServletRequest req) {
System.out.println("请求方式:" + req.getMethod());
System.out.println("资源路径(URL):" + req.getRequestURL());
System.out.println("资源路径(URI):" + req.getRequestURI());
System.out.println("协议版本号:" + req.getProtocol());
System.out.println("协议名:" + req.getScheme());
}
d)获取请求头信息
private void getReqHead(HttpServletRequest req) {
Enumeration<String> names = req.getHeaderNames();
while (names.hasMoreElements()) {
String name = names.nextElement();
System.out.println(name + "=" + req.getHeader(name));
}
}
e)获取请求实体
private void getReqEntity(HttpServletRequest req) {
// 获取一个值时使用getParameter
String uname = req.getParameter("uname");
// 获取多个值时使用getParameterValues
String[] hobs = req.getParameterValues("hob");
System.out.println("uname:" + uname);
System.out.println("hob:" + Arrays.toString(hobs));
}
f)获取请求信息的其他信息
private void getReqOthers(HttpServletRequest req) {
System.out.println("服务器的地址:" + req.getLocalAddr());
System.out.println("服务器的名称:" + req.getLocalName());
System.out.println("服务器端口号:" + req.getLocalPort());
System.out.println("客户端的地址:" + req.getRemoteAddr());
System.out.println("客户端的主机:" + req.getRemoteHost());
System.out.println("客户端端口号:" + req.getRemotePort());
System.out.println("获取上下文路径(当前项目):" + req.getContextPath());
}
2.HttpServletResponse
a)HttpServletResponse是一个接口,继承了ServletResponse接口;
b)HttpServletResponse对象由服务器,并作为参数传递service方法,用于帮助Servlet对客户端的请求做出响应。
c)HttpServletResponse对象用于设置响应头和响应实体;
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置响应头
resp.setHeader("Content-Type", "text/html;charset=utf-8");
resp.setHeader("pc", "DELL");
// 重名时也不会覆盖
resp.addHeader("pc", "Lenovo");
// 设置响应实体
resp.getWriter().print("<h1>今天天气不错!</h1>");
}
3.解决各种乱码问题
发生乱码问题的原因是由于编码方式不一致,因此,解决乱码的核心思想是统一编码方式,UTF-8被称为万国码,是一个非常好的选择。
3.1前台页面乱码
需要在页面中添加meta标签,告知浏览器使用utf-8编码。
<!-- 告诉浏览器要使用utf-8的方式编码页面 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
3.2后台乱码
Tomcat7.0及之前的版本,默认采用ISO-8859-1的编码方式。
Tomcat8.0开始,默认编码方式改为UTF-8。
3.2.1后台请求乱码
3.2.1.1post请求乱码
在接收数据前,设置请求实体编码方式为UTF-8即可
//设置请求的字符集
req.setCharacterEncoding("utf-8");
3.2.1.2get请求乱码
a) 方式一: 先用ISO-8859-1解码, 再用UTF-8编码.
|
String uname = req.getParameter("uname"); // 用iso-8859-1解码字符串 byte[] bytes = uname.getBytes("iso-8859-1"); // 用utf-8重新编码 uname = new String(bytes, "utf-8"); |
b) 方式二: 修改服务器配置文件server.xml, 使用UTF-8编码路径
|
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8" /> |
c) 方式三: 修改服务器配置文件server.xml, 使用请求实体的编码方式来编码路径, 较为灵活.
|
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true" /> |
|
req.setCharacterEncoding("utf-8"); String uname = req.getParameter("uname"); |
3.2.2后台响应乱码
设置服务器使用UTF-8编码响应信息,同时,告知浏览器使用UTF-8编码响应信息;
//设置响应的字符集
resp.setCharacterEncoding("utf-8");
// 告诉浏览器使用utf-8编码响应内容
// resp.setHeader("Content-Type", "text/html;charset=utf-8");
resp.setContentType("text/html;charset=utf-8");
4.页面跳转的两种方式
4.1请求转发
a)只发送一次请求
b)地址栏不发生改变
c)数据可以一直传递
d)只能舔砖内部资源,不能访问外部资源
// 请求转发--getRequestDispatcher
req.getRequestDispatcher("dis2").forward(req, resp);
4.2重定向
a)会发送多次请求
b)地址栏会发生改变
c)数据不能继续传递
d)内部资源和外部资源都可以访问
// 重定向---sendRedirect
resp.sendRedirect("red2?mouse="+req.getParameter("mouse"));
5.ServletConfig
a)ServletConfig用于配置Servlet,在初始化Servlet的时候对Servlet进行配置;
b)Servlet容器会自动将<init-param>中的数据封装为ServletConfig对象,并将其传到init方法中,对Servlet进行初始化操作;
5.1通过配置文件配置init-param
<servlet>
<servlet-name>ConfigServlet</servlet-name>
<servlet-class>com.bjsxt.servlet.ConfigServlet</servlet-class>
<!-- 用于提供Servlet的配置信息, 供服务器封装ServletConfig对象使用 -->
<init-param>
<param-name>keyboard</param-name>
<param-value>Razer</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ConfigServlet</servlet-name>
<url-pattern>/conf</url-pattern>
</servlet-mapping>
5.2通过注解配置init-param
@WebServlet(value="/conf2", initParams=@WebInitParam(name="keyboard", value="luoji"))
public class ConfigServlet extends HttpServlet {}
5.3 使用ServletConfig
|
@Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 获取ServletConfig对象 ServletConfig config = this.getServletConfig(); // 获取初始化参数 System.out.println("keyboard:" + config.getInitParameter("keyboard")); // 获取当前Servlet的名字 System.out.println("name:" + config.getServletName()); } |
1. ServletContext
a) ServletContext是Servlet的上下文对象, 代表了整个应用程序. 一个项目中只有一个ServletContext对象, 所以它经常被称之为Application.
b) 所有的Servlet共享ServletContext对象.
6.1 获取ServletContext对象的三种方式
|
// [1] 直接调用getServletContext方法 ServletContext ctx1 = this.getServletContext(); // [2] 通过ServletConfig对象获取 ServletContext ctx2 = getServletConfig().getServletContext(); // [3] 通过req对象获取 ServletContext ctx3 = req.getServletContext(); |
6.2 全局配置参数
|
<!-- 全局配置参数 --> <context-param> <param-name>computer</param-name> <param-value>Lenovo</param-value> </context-param> |
6.2 ServletContext常用功能
|
// [功能1] 获取全局配置参数 System.out.println("computer:" + ctx1.getInitParameter("computer")); // [功能2] 获取一些相关的路径 System.out.println("上下文路径:" + req.getContextPath()); System.out.println("上下文路径:" + ctx1.getContextPath()); System.out.println("获取当前项目的绝对路径:" + ctx1.getRealPath("")); System.out.println("获取upload的绝对路径:" + ctx1.getRealPath("upload")); // [功能3] 加载静态资源 InputStream is = ctx1.getResourceAsStream("WEB-INF/web.xml"); BufferedReader br = new BufferedReader(new InputStreamReader(is)); PrintWriter pw = new PrintWriter(System.out); String line = null; while((line = br.readLine()) != null) { pw.println(line); } pw.close(); br.close(); // [功能4] 请求转发 ctx1.getRequestDispatcher("/demo.html").forward(req, resp); |
乱码问题-页面跳转方式-Servlet配置文件的更多相关文章
- SpringMVC 04: SpringMVC中4种页面跳转方式
转发和重定向的页面跳转方式 页面跳转方式,本质上只有2种方式:转发 + 重定向 但在SpringMVC的具体实现上,转发可以细分为:普通的页面转发 + 经由action方法的页面转发 重定向可以细分为 ...
- JSP页面跳转方式
JSP页面跳转方式 1.利用按钮+javascript进行跳转 <input type="button" name="button2" value=&qu ...
- 微信小程序 页面跳转方式
// 保留当前页面,跳转到应用内的某个页面,使用wx.navigateBack可以返回到原页面. // 注意:调用 navigateTo 跳转时,调用该方法的页面会被加入堆栈,但是 redirectT ...
- JavaWeb学习——页面跳转方式
JavaWeb学习——页面跳转方式 摘要:本文主要学习了请求转发和响应重定向,以及两者之间的区别. 请求转发 相关方法 使用HttpServletRequest对象的 getRequestDispat ...
- springMVC 几种页面跳转方式
今天主要写一下响应界面跳转的几种方式 1.在注解的方式中 1.1通过HttpServletResponse的API直接输出(不需要配置渲染器) controller类的主要代码 @Controller ...
- JS页面打开方式丶对话框及页面跳转方式
一.js页面的三种打开方式 1. window.open 2. window.navigate("url") 跳转到目标页面 3. window.location.href=&qu ...
- 原创+转发:微信小程序navigator、redirectTo、switchTab几种页面跳转方式
什么是事件? 事件是视图层到逻辑层的通讯方式. 事件可以将用户的行为反馈到逻辑层进行处理. 详解(以常见的tap点击事情为例) 模板.wxml代码: <view id="tapTest ...
- java Web中页面跳转方式之请求转发
1.在一个请求中跨越多个Servlet 2.多个Servlet在一个请求中,他们共享request对象.就是在Servlet01中setAttribute()保存数据在Servlet02中由getAt ...
- 在jsp中常用的内置对象(5个)小总结和两种页面跳转方式(服务器端调转、客户端跳转)的区别
jsp中常用的几个内置对象: 一.request对象 主要作用: (1)获取请求页面的信息 比如:request.getParameter("参数名"); (2)获取客户端 ...
随机推荐
- CentOS 7.4 安装 K8S v1.11.0 集群所遇到的问题
0.引言 最近打算将现有项目的 Docker 部署到阿里云上面,但是之前是单机部署,现在阿里云上面有 3 台机器,所以想做一个 Docker 集群.之前考虑是用 Docker Swarm 来做这个事情 ...
- yum install --downloadonly 下载依赖包研究
在CentOS中可以使用yum自动安装软件,在离线环境中却行不通. Linux localhost 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 U ...
- selenium之 玩转鼠标键盘操作(ActionChains)
用selenium做自动化,有时候会遇到需要模拟鼠标操作才能进行的情况,比如单击.双击.点击鼠标右键.拖拽等等.而selenium给我们提供了一个类来处理这类事件——ActionChains sele ...
- Jenkins问题记录:android构建时提示Unzipping /home/.gradle/wrapper/dists/gradle-3.3-all/55gk2rcmfc6p2dg9u9ohc3hw9/gradle-3.3-all.zip to /home/.gradle/wrapper/dists/gradle-3.3-all/55gk2rcmfc6p2dg9u9ohc3hw9 Except
-------------- -------------- 问题:今日job构建报出如下错误: Unzipping /home/.gradle/wrapper/dists/gradle-3.3-all ...
- Java 并发编程-再谈 AbstractQueuedSynchronizer 3 :基于 AbstractQueuedSynchronizer 的并发类实现
公平模式ReentrantLock实现原理 前面的文章研究了AbstractQueuedSynchronizer的独占锁和共享锁,有了前两篇文章的基础,就可以乘胜追击,看一下基于AbstractQue ...
- 【Go】strings.Replace 与 bytes.Replace 调优
原文链接:https://blog.thinkeridea.com/201902/go/replcae_you_hua.html 标准库中函数大多数情况下更通用,性能并非最好的,还是不能过于迷信标准库 ...
- Perl输出复杂数据结构:Data::Dumper,Data::Dump,Data::Printer
输出复杂结构 Data::Dumper.Data::Dump.Data::Printer都可以用来输出复杂的数据结构.本文只介绍简单的几个输出形式,以后再需要的地方再详细介绍. 前两者建议传递数据结构 ...
- SSM框架的sql中参数注入(#和$的区别)
<select id="findUsersByUserName2" resultType="java.util.Map" parameterType=&q ...
- python的一些内置模块
整理了几种python的常用内置模块. 内置函数思维导图:https://www.processon.com/view/link/5c7902b1e4b0168e4200846a re模块 re(re ...
- iis访问网络路径映射问题(UNC share)
最近在做一个功能,涉及到nas网络磁盘文件的保存和访问,在服务器上将对应的路径映射为Z盘,结果在iis上部署网站直接访问该路径,报无法找到该路径的错误. 用的是.net core开发,在vs直接启动程 ...