ServletConfig对象

是Servlet的配置对象,每一个Servlet都拥有一个配置对象。我们在web.xml中,进行servlet的配置时,可以向Servlet中添加初始化的参数,这些参数,会被存储到一个ServletConfig对象中.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<servlet>
<servlet-name>s1</servlet-name>
<servlet-class>demo.Servlet1</servlet-class>
<init-param>
<param-name>sqlname</param-name>
<param-value>hahaha</param-value>
</init-param>
<init-param>
<param-name>sqlpass</param-name>
<param-value>123</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>s1</servlet-name>
<url-pattern>/s1.do</url-pattern>
</servlet-mapping>

在Servlet类中, 可以通过两种方式, 来获取配置对象 , 这两种方式在使用中, 是互斥的.

方式1:生命周期init方法中, 存储ServletConfig参数.在方法中使用参数即可.

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package demo;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class Servlet1 extends HttpServlet {
/*@Override
public void init(ServletConfig config) throws ServletException {
String sqlName = config.getInitParameter("sqlname");
String sqlPass = config.getInitParameter("sqlpass");
System.out.println("sqlName: "+sqlName);
System.out.println("sqlPass: "+sqlPass);
}*/
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletConfig config = getServletConfig();
String sqlName = config.getInitParameter("sqlname");
String sqlPass = config.getInitParameter("sqlpass");
System.out.println("sqlName2: "+sqlName);
System.out.println("sqlPass2: "+sqlPass);
response.getWriter().append("ok");
}
}

GET请求与POST请求

  • GET请求

    请求的参数 以多个键值对的形式存储在网址中, 在网址的?后 , 键与值键值使用等号连接, 多个键值对之间&分割

    只能阐述字符串类型的参数

    网址的最大长度为4kb , 通常支持的文字数量是: 最大2048

    数据传输的时不安全

  • POST请求

    请求的参数 以多个键值对的形式存储在单独的数据包中 , 这个数据包叫做请求体.

    请求体中可以包含任意类型的数据, 例如: 图片 . 音频 等…

    数据大小,理论上是无上限的.

    因为请求体是单独的数据包, 所以较GET请求而言安全;

  • 什么样的请求是GET

    浏览器输入网址 , 回车;点击超链接访问;表单提交时, method=GET;通过js: wondow.location对象,进行替换与跳转;ajax的get请求

  • 什么样的请求是POST

    表单提交时method=POST,ajax的post请求

请求乱码的问题解决

Tomcat9版本之后的请求乱码已经默认解决。

  • 方式1

    适用于tomcat8版本之前的GET请求乱码解决, 以及所有版本的POST乱码解决:

    解决乱码的原理: 将文字乱码的流程, 倒序执行一遍,得到正确的文字.

    1.将乱码的文字,按照ISO-8859-1转换为字节数组

    2.将字节数组按照UTF-8的编码转换为文字

    1
    2
    3
    4
    //1.  将乱码的文字,按照ISO-8859-1转换为字节数组
    byte[] bytes = 乱码文字.getBytes("ISO-8859-1");
    //2. 将字节数组按照UTF-8的编码转换为文字
    String text = new String(bytes,"UTF-8");
  • 方式2

    适用于tomcat所有版本的post乱码的解决.

    解决乱码的原理:在使用请求体之前, 将请求体的默认编码更改为utf-8.

    1
    2
    //设置请求体的编码,  一定要写在获取参数之前.
    request.setCharacterEncoding("UTF-8");

接受GET和POST请求的参数

在项目的web目录下创建index.html,并输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 相对路径: 相对于代码文件所有路径的拼接
例如: 相对路径为: images/x.jpg
代码文件路径: c://1.html
则此相对路径 ,所表示的文件路径是: c://images/x.jpg

特殊相对路径的写法:
例如: /images/x.jpg
文件路径是:
当前代码所在根路径拼接:
例如: html运行的网址是: www.baidu.com/a/b.html
路径是: /images/x.jpg
则访问的图片地址: www.baidu.com/images/x.jpg

绝对路径: 带有盘符, 或协议的文件路径:
例如: c://1.jpg
文件路径就是: c://1.jpg
-->
<form action="login3.do" method="POST">
<input class="form-control input-lg" placeholder="请输入帐号" name="username"><br>
<input class="form-control input-lg" placeholder="请输入密码" name="password"><br>
<button class="btn btn-success btn-block btn-lg">登&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;录</button>
</form>
</body>
</html>

在项目的src目录下创建servlet.class并输入,根据请求方式编写doget和dopost方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package demo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
* Servlet implementation class LoginServlet3
*/
@WebServlet("/login3.do")
public class LoginServlet3 extends HttpServlet {

/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
* 访问此servlet映射的网址时会更据请求的方式,来执行doget、dopost方法
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet触发了");
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("doGet帐号:"+username);
System.out.println("doGet密码:"+password);
}

/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost触发了");
request.setCharacterEncoding("UTF-8");//解决乱码方式2
String username = request.getParameter("username");
String password = request.getParameter("password");

/*
解决乱码方式1
1. 将乱码的文字,按照ISO-8859-1转换为字节数组
byte[] bytes1 = username.getBytes("ISO-8859-1");
2. 将字节数组按照UTF-8的编码转换为文字
username = new String(bytes1,"UTF-8");
1. 将乱码的文字,按照ISO-8859-1转换为字节数组
byte[] bytes2 = password.getBytes("ISO-8859-1");
2. 将字节数组按照UTF-8的编码转换为文字
password = new String(bytes2,"UTF-8");
*/

System.out.println("doPost帐号:"+username);
System.out.println("doPost密码:"+password);
}
}