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配置文件的更多相关文章

  1. SpringMVC 04: SpringMVC中4种页面跳转方式

    转发和重定向的页面跳转方式 页面跳转方式,本质上只有2种方式:转发 + 重定向 但在SpringMVC的具体实现上,转发可以细分为:普通的页面转发 + 经由action方法的页面转发 重定向可以细分为 ...

  2. JSP页面跳转方式

    JSP页面跳转方式 1.利用按钮+javascript进行跳转 <input type="button" name="button2" value=&qu ...

  3. 微信小程序 页面跳转方式

    // 保留当前页面,跳转到应用内的某个页面,使用wx.navigateBack可以返回到原页面. // 注意:调用 navigateTo 跳转时,调用该方法的页面会被加入堆栈,但是 redirectT ...

  4. JavaWeb学习——页面跳转方式

    JavaWeb学习——页面跳转方式 摘要:本文主要学习了请求转发和响应重定向,以及两者之间的区别. 请求转发 相关方法 使用HttpServletRequest对象的 getRequestDispat ...

  5. springMVC 几种页面跳转方式

    今天主要写一下响应界面跳转的几种方式 1.在注解的方式中 1.1通过HttpServletResponse的API直接输出(不需要配置渲染器) controller类的主要代码 @Controller ...

  6. JS页面打开方式丶对话框及页面跳转方式

    一.js页面的三种打开方式 1. window.open 2. window.navigate("url") 跳转到目标页面 3. window.location.href=&qu ...

  7. 原创+转发:微信小程序navigator、redirectTo、switchTab几种页面跳转方式

    什么是事件? 事件是视图层到逻辑层的通讯方式. 事件可以将用户的行为反馈到逻辑层进行处理. 详解(以常见的tap点击事情为例) 模板.wxml代码: <view id="tapTest ...

  8. java Web中页面跳转方式之请求转发

    1.在一个请求中跨越多个Servlet 2.多个Servlet在一个请求中,他们共享request对象.就是在Servlet01中setAttribute()保存数据在Servlet02中由getAt ...

  9. 在jsp中常用的内置对象(5个)小总结和两种页面跳转方式(服务器端调转、客户端跳转)的区别

    jsp中常用的几个内置对象: 一.request对象 主要作用:  (1)获取请求页面的信息   比如:request.getParameter("参数名");  (2)获取客户端 ...

随机推荐

  1. 学习Raft算法的笔记

    Raft是一种为了管理日志复制的一致性算法.它提供了和Paxos算法相同的功能和性能,但是它的算法结构和Paxos不同,使得Raft算法更加容易理解并且更容易构建实际的系统.为了提升可理解性,Raft ...

  2. [CXF REST标准实战系列] 二、Spring4.0 整合 CXF3.0,实现测试接口

    Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章Points: 1.介绍RESTful架构 ...

  3. vue-15-vuex-store的用法

    vue-16-vuex 1, 介绍 对 vue 进行状态管理的, 集中存储所有组件的所有状态, 解决多个组件共享数据的问题. 即, 所有组件可以拿到同样的状态, 组件间共享数据 2, 在之前进行数据交 ...

  4. mysql中外键的特点

    mysql中外键的特点简单描述: 1.要求在从表中设置外键关系: 2.从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求: 3.主表的关联列必须是一个key(一般是主键或唯一键): 4. ...

  5. Win32编程之静态库编写与使用.动态链接库的编写与使用

    Win32编程之静态库编写与使用.动态链接库的编写与使用 一丶什么是静态库.什么是动态链接库. 静态库其实就是解决模块开发的一种解决方案.在以前.我们写代码的时候.每个人都可以独立写一个项目.但是现在 ...

  6. Mycat - 实现数据库的读写分离与高可用

    前言 开心一刻 上语文课,不小心睡着了,坐在边上的同桌突然叫醒了我,并小声说道:“读课文第三段”.我立马起身大声读了起来.正在黑板写字的老师吓了一跳,老师郁闷的看着我,问道:“同学有什么问题吗?”,我 ...

  7. mybatis逆向工程(MyBatis Generator)

    mybatis逆向工程(MyBatis Generator) 1. 什么是mybatis逆向工程 mybatis官方为了提高开发效率,提高自动对单表生成sql,包括 :mapper.xml.mappe ...

  8. 【模板小程序】任意长度非负十进制数转化为二进制(java实现)

    妈妈再也不用担心十进制数过大了233(注意只支持非负数) import com.google.common.base.Strings; import java.math.BigInteger; imp ...

  9. Java 内部类及其原理

    Java中实现内部类 内部类相信大家都用过很多次了,就不说它是怎么用的了. 内部类 1.成员内部类 需要注意的是, 当成员内部类拥有和外部类同名的成员变量或这方法时, 默认情况下访问的是内部类的成员, ...

  10. Javascript继承4:洁净的继承者----原型式继承

    //原型式继承 function inheritObj(obj){ //声明一个过渡函数对象 function F(){} //过渡对象的原型继承父对象 F.prototype = obj; //返回 ...