JavaWEB学习笔记

JavaWeb

1. Servlet

1.1 Servlet的生命周期

  • 什么是生命周期??

    生命周期:一个对象从创建到销毁的全过程.

  • Servlet的生命周期

    Servlet是在第一次被访问的时候会被实例化。只要Servlet一被实例化那么Servlet中的init方法就会执行(init只会执行一次)。任何一次从客户端发送来的请求,那么Servlet中的service方法就会执行(在service方法的内部根据请求的方式不同调用不同的doxxx方法)。当Servlet从服务器中移除或服务器关闭时Servlet对象被销毁,里面的destroy方法就会执行,然后垃圾回收器就会将其回收掉。

1.2 Servlet启动时加载

  • 为什么使用启动时加载

    Servlet对象是第一次被访问的时候会被创建的,init方法就会执行。假设在init方法中做了一些比较耗时的操作(比如:加载了一些配置文件并且解析可能需要花费3秒钟)。第一个用户第一次访问这个Servlet的时候,需要等待3秒钟。如何使第一个用户在第一次访问的时候不需要花费这么长时间?

    配置启动时加载: 在web.html中Servlet配置下设置2(数字越小优先级别越高)

    service.xml中有设置一个默认的servlet,它的启动时加载的优先级别为1.因此我们在设置启动时加载的优先级别从2开始。

1.3 Servlet路径配置

  • 全路径匹配

    以/开始 比如:/ServletDemo1 /aaa/ServletDemo2

  • 目录匹配

    以 / 开始,以 /结束 比如:/ /aaa/* /aaa/bbb/*

  • 扩展名匹配

    不能以 / 开始,以开始 比如:.action *.do *.jsp

访问的优先级别:完全路径匹配 > 目录匹配 > 扩展名匹配

1.4 ServletConfig对象

​ ServletConfig用来获得Servlet的相关的配置的对象。

  • 获得ServletConfig对象

    img

  • ServletConfig对象的API

    img

     获得Servlet的初始化参数 getInitParameter(String name)

    ​ getInitParameterNames()

     获得ServletContext对象 getServletContext()

     获得Servlet的名称 getServletName()

  • 配置初始化参数

    1559478471685

1.5 ServletContext对象

  • 什么是ServletContext

    ServletContext:Servlet的上下文对象。ServletContext对象对Servlet之前和之后的内容都知道。这个对象一个web项目只有一个。在服务器启动的时候为每个web项目创建一个单独的ServletContext对象。

  • ServletContext获取工程信息

    因为一个web项目只有一个ServletContext对象,所以这个对象对整个项目的相关内容都是了解的。

    • 获取文件的MIME类型:getMimeType(String File)

      img

    • 获取web项目请求工程名:getContextPath()

      img

    • 获取web项目的初始化参数:getInitParameter(String name)

      ​ getInitParameterNames()

      img

  • 配置全局初始化参数

    1559479154836

  • Servlet对象读取web项目下的文件

    之前使用IO流就可以读取文件(java项目中)。现在是一个web项目,web项目需要发布到tomcat下才能访问的。获取web项目下的文件如果使用传统的IO就会出现问题(原因:路径中使用的是相对路径,相对的是JRE环境)。

    1559479472885

    getServletContext() –> 获取ServletContext对象

    方法一:通过ServletContext的getResourceAsStream(“路径”)方法获取输出流

    方法二: 通过ServletContext的getRealPath(“路径”)方法获得文件的真正路径


  • ServletContext作为域对象

    域对象:指的是将数据存入到域对象中,这个数据就会有一定的作用范围。域指的是一定的作用范围。

    • ServletContext是在服务器启动的时候为每个web项目单独创建一个ServletContext对象。当web项目从服务器中移除,或者是关闭服务器的时候ServletContext对象会被销毁。向ServletContext中保存的数据一直存在(当服务器关闭的时候ServletContext对象被销毁,然后里面数据才会失效)。范围:整个web应用。

    • ServletContext作为域对象的API

      存入数据的方法:setAttribute(String name, Object value)

      img

    • 获取数据的方法: getAttribute(String name)

      img

    • 移除数据的方法: removeAttribute(Steing name)

      img

2.Response对象

2.1 什么是Response

​ 开发的软件是B/S结构的软件,可以通过浏览器访问服务器的软件。从浏览器输入一个地址访问服务器(将这个过程称为是请求)。服务器接收到请求,需要进行处理,处理以后需要将处理结果显示回浏览器端(将这个过程称为是响应)。

img

2.2 Response对象的API

  • Response关于相应行的方法

    img

    setStatus(int sc)

    响应码:

     200 正确
     302 重定向
     304 查找本地缓存
     404 请求资源不存在
     500 服务器内部错误

  • Response关于响应头的方法

    img

    set开头的方法:针对一个key对应一个value的情况.

     举例:比如有一个头 content-Type:text/html setHeader(“content-Type”,”text/plain”);
     最终得到头的结果:content-Type:text/plain

    img

    add开头的方法:针对一个key对应多个value的情况。

 举例:比如有一个content-Type:text/html addHeader(“content-Type”,”text/plain”);
 最终得到头的结果:content-Type:text/html,text/plain

  • Response关于响应体的方法

    img

    获得输出流

  • Response其他的API

    • 重定向的方法 sendRedirect(String Location)

      img

    • 设置浏览器打开页面时候采用的字符集 setContentType(String type)

      img

    • 设置响应字符流的缓冲区字符集 setCharacterEncoding(String charset)

      img

    • 服务器向浏览器回写Cookie的方法 addCookies(Cookies cookies)

      img

2.3 Response对象API的代码实现

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
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ResponseDemo02 extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(1);
//重定向
//设置状态码
response.setStatus(302);
//设置重定向地址
response.setHeader("Location", "/web01/HelloServlet");
//重定向的常用方法
response.sendRedirect("/web01/HelloServlet02");
//定时刷新
response.setHeader("Refresh", "5;url=/web01/HelloServlet03");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}

2.4 Response对象响应的中文乱码处理

1
2
3
4
5
6
// 字节流输出中文(乱码是由于字节流bytes数组编码格式和浏览器默认的编码格式不一致)
// 设置浏览器的默认编码格式
response.setHeader("Content-Type", "text/html;charset=UTF-8");
// 设置bytes数组的编码格式
byte[] bytes = "中文".getBytes("UTF-8");
response.getOutputStream().write(bytes);
1
2
3
4
5
6
7
8
// 字符流输出中文(乱码是由于浏览器的缓冲区的默认编码格式为"ISO-8859-1",该编码不支持中文)
// 修改缓冲区编码格式
// response.setCharacterEncoding("UTF-8");
// // 修改浏览器默认编码格式
// response.setHeader("Content-Type", "text/html;charset=UTF-8");
//简便方法
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println("中文");

3. Request对象

3.1 什么是Request对象

​ 开发的软件都是B/S结构软件,从浏览器向服务器提交一些数据,将这些内容进行封装就封装成了一个请求对象(Request对象)。

3.2 Request对象的API

获得客户机信息

  • 获取请求方式 getMethod()
  • 获取请求路径后的提交参数的字符串 getQueryString()
  • 获得请求路径的URL和URI
    • getRequestURI
    • getRequestURL
  • 获得客户机的IP的方法 getRemoteAddr()

获得请求头的方法

  • 获得一个key对应一个value的请求头 getHeader(String name)
  • 获得一个key对应多个value的请求头 getHeaders(String name)

获得请求参数的方法

  • 获得提交的参数(一个name对应一个key) getParameter(String name)

  • 获得提交的参数(一个name对应多个key) getParameterValues(String name)

  • 获得提交的参数,将提交的参数的名称和对应的值存进一个Map集合中

    getParameterMap()

Resquest作为域对象存取数据的方法(域作用)范围为本次请求响应)

  • 从request域中存数据 addAtrribute(String name, Object o)
  • 从request域中获取数据 getAttribute(String name)
  • 从request域中移除数据 removeAtrribute(String name)

request作为域对象的作用范围:

Request对象其实就是从客户端浏览器向服务器发送的一次请求信息的封装。那么实质上向Request中所保存的数据有效期也是一次请求范围

一次请求范围:从客户端浏览器向服务器发送一次请求,服务器针对这次请求对浏览器作出响应。当服务器作出响应之后,请求对象就销毁了,保存在其中的数据就无效了。

3.3 Request对象API的代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//获取请求方法
String method = request.getMethod();
System.out.println(method);
//获取客户机ip
String ip = request.getRemoteAddr();
System.out.println(ip);
//获取请求参数的字符串
String queryString = request.getQueryString();
System.out.println(queryString);
//获取请求路径的URL和URI
StringBuffer url = request.getRequestURL();
System.out.println("URL---" + url);
String uri = request.getRequestURI();
//获取用户浏览器信息
System.out.println("URI---" + uri);
System.out.println(request.getHeader("User-Agent"));
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
53
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RequestDemo01 extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 通过request.getParameter(name)获取request请求中的参数
// String username = request.getParameter("username");
// String password = request.getParameter("password");
// String sex = request.getParameter("sex");
// String city = request.getParameter("city");
// String[] hobby = request.getParameterValues("hobby");
// String info = request.getParameter("info");
// System.out.println(username);
// System.out.println(password);
// System.out.println(sex);
// System.out.println(city);
// System.out.println(Arrays.toString(hobby));
// System.out.println(info);
// 通过request.getParameterNames()方法获取request中的参数
// 此方法适用于一个key对应一个value的情况
// Enumeration<String> names = request.getParameterNames();
// while (names.hasMoreElements()) {
// String name = names.nextElement();
// String value = request.getParameter(name);
// System.out.println(name + "---" + value);
// }
// 通过request.getParameterMap()来获取request的参数
Map<String, String[]> map = request.getParameterMap();
for (String key : map.keySet()) {
String[] value = map.get(key);
if (value.length == 1) {
System.out.println(key + "---" + value[0]);
} else {
System.out.println(key + "---" + Arrays.toString(value));
}
}
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}

3.4 Request对象接收表单请求参数的中文乱码处理

1
2
3
4
5
6
7
//post提交方式,请求参数中文乱码是由于post的请求参数是从请求体中拿到缓冲区中,而缓冲区的默认编码格式为ISO-8859-1,需设置缓冲区的编码格式
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");
System.out.println(username);
}

//get提交方式,请求参数中文乱码是由于get的请求数据是先通过UTF-8的Url编码变成%十六进制的形式拼接在请求行,再存储在缓冲区,缓冲区的默认编码格式为ISO-8859-1.为了将参数转换成中文提取出,需要先以ISO-8859-1的编码格式从缓存区中取出数据,再把数据进行UTF-8的解码,解析成中文

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String name = request.getParameter("username");

// String encode = URLEncoder.encode(name, "ISO-8859-1");

// String decode = URLDecoder.decode(encode, "UTF-8");

// System.out.println(decode);

//常用方法

String username = new String(name.getBytes("ISO-8859-1"), "UTF-8");

System.out.println(username);

}