Servlet,接收用户表单的参数,GET,POST,乱码问题:

Servlet的生命周期:
指的是Servlet从创建到消亡的周期!

Servlet的创建时机: 默认情况, 当用户第一次访问Servlet的映射地址时, 对象创建

Servlet的销毁时机: 当tomcat关闭,或者 项目从tomcat删除时,Servlet被销毁

三个方法的体现:

  1. init方法 : 此方法在对象创建后,执行
  2. service方法 : 服务方法,当用户每一次访问时,执行,用于处理用户的请求,以及对用户进行响应
  3. destroy方法 : 当tomcat关闭 或 项目从tomcat删除时 执行

在编辑项目的时候遇到了idea不能使用@WebServlet,找了很久才找到解决方法

解决问题的博客:https://blog.csdn.net/alinekang/article/details/75669819

ServletConfig对象:
是Servlet的配置对象,每一个Servlet都拥有一个ServletConfig.
我们在web.xml中 进行Servlet配置是, 可以向一个Servlet中 添加初始化的参数 这些参数以键值对的形式存储在ServletConfig中

在web.xml中,向ServletConfig存储数据格式:

<servlet>
    ...
    <!-- init-param标签可以存在多个,每个init-param都表示一个键值对 -->
    <init-param>
        <param-name>键</param-name>
        <param-value>值</param-value>
    </init-param>
</servlet>

在Servlet中 得到ServletConfig对象的方式:
方式1与方式2是互斥的

  1. 在Servlet中,重写生命周期init(ServletConfig config)方法, 使用方法参数中的config对象

  2. 在Servlet的任意代码位置,通过getServletConfig();方法,得到对象

从ServletConfig 取出数据的格式:

```
String value = config对象.getInitParameter(String name);
```

Servlet的创建时机(懒汉 变 饿汉):

在web.xml中 配置servlet时

<servlet>
    <servlet-name...
    <servlet-class...
    <load-on-startup>数字</load-on-startup>
</servlet>

load-on-startup:
取值为数字:(默认值为-1)
当值为负数是:懒汉模式,第一次请求时加载,
当值>=时,描述的是请求的顺序,值越小越早加载

如果多个servlet值相同: 按照web.xml中servlet的配置顺序 自上而下加载

接受用户表单的参数:

  1. 根据一个name,接收单个参数
    String value = request.getParameter(String name);
    
  2. 根据一个name,接收一组参数
    String[] values = request.getParameters(String name);
    

HttpGET请求 与 HttpPOST请求的区别:
GET请求:

  • 请求的参数,以键值对的形式存储在网址中 ,在网址中,编写在?后,有1个或多个键值对之间使用&分割
  • 只能传输字符串类型的参数
  • 网址的最大长度为4kb 通常支持的文字2048个文字
  • 数据传输不安全

tomcat8+版本: GET请求不会乱码

POST请求:

  • 请求的数据,以键值对的形式存储在请求体中
  • 请求体是一个单独的数据包,较GET请求而言, 安全
  • 可以传输任意类型的数据
  • 数据的大小,理论上是无上限的

tomcat8+版本: Post请求默认编码为 ISO-8859-1(不支持中文)

什么样的请求时GET:
以我们目前所学习的技术来说,除了表单提交是method=”POST”,其他的访问方式都是GET请求

例如:

  • 点击超链接 访问
  • 通过js: window.location.href=’’访问
  • 浏览器中输入网址+回车
  • 表单提交时,method=”GET” 或默认
  • ajax的get请求

什么样的请求是POST:

  • 表单提交时method=”POST”
  • ajax的post请求
  • Java代码的URL类的POST请求

响应的乱码问题:

  1. 设置网页的内容类型,以及网页的编码格式:

    response.setContentType("text/html;charset=utf-8");
    
  2. 设置网页的编码格式(因为没有设置网页内容类型为html,所以浏览器解析时也是乱码)

    response.setCharacterEncoding("UTF-8");
    

请求的乱码问题:

解决乱码的两种格式:
格式1.
tomcat8版本之前,get请求会乱码 以及 所有版本的POST请求乱码:
解决方案:
将乱码的文字,按照乱码的编码ISO-8859-1转换为字节数组,再按照正常的编码UTF-8组装为文字;

案例:

// 1. 接受用户传递的参数
String username = request.getParameter("username");
// 解决乱码  
{
    // 2. 将乱码的文字通过ISO-8859-1编码打碎成字节数组  
    byte[] bytes = username.getBytes("ISO-8859-1");
    // 3. 通过UTF-8编码,将字节数组 重新组装为正常文字  
    username = new String(bytes,"UTF-8");
}

格式2.
格式1 解决乱码适用于参数较少的情况,如果参数过多,解决起来极其麻烦.
tomcat为我们提供了 设置请求体编码的方式:

注意: 只有POST请求,才有请求体  

格式: request.setCharacterEncoding("UTF-8");  

注意:
设置响应乱码的两种方式,都必须写在响应内容之前!