Servlet
1.Tomcat服务器
Tomcat 是一个符合 JavaEE WEB 标准的最小的WEB 容器,所有的 JSP 程序一定要有 WEB 容器的支持才能运行,而且在给定的 WEB 容器里面都会支持事务处理操作。
2.Servlet的实现
-
安装Tomcat 或者免安装版直接解压
-
IDEA配置Tomcat
-
创建Web项目
3.实现 Servlet 规范
实现 Servlet 规范,即继承 HttpServlet 类,并到如响应的包,该类中已经完成了通信的规则,我们只需要进行业务的实现即可
- 继承HttpServlet 类 遵循servlet标准(继承 HttpServlet)
- 重写 service 方法 重写service方法(当前Servlet 类被访问时自动调用service方法)
- 设置注解 设置对外访问的路径 (设置@WebServlet("/路径"))
package com.xxxx.servlet;
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;
public class Servlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("hello servlet");
System.out.println("你好 servlet");
}
}
4.Servlet的生命周期
4.1 实例和初始化时机
当请求到达容器时,容器查找该 servlet 对象是否存在,如果不存在,则会创建实例并进行初始化。
当资源被访问时自动调用初始化方法 调用时只执行一次
4.2 就绪/调用/服务阶段
有请求到达容器,容器调用 servlet 对象的 service()方法,处理请求的方法在整个生命周期中可以被多次调用; HttpServlet 的 service()方法,会依据请求方式来调用 doGet()或者 doPost()方法。但是,这两个 do 方法默认情况下,会抛出异常,需要子类去 override。
4.3 销毁时机
当容器关闭时(应用程序停止时),会将程序中的 Servlet 实例进行销毁
5.HttpServletRequest对象
5.1 接收请求的常用方法
// 获取客户端请求的完整URL (从http开始,到?前面结束)
String url = request.getRequestURL().toString();
System.out.println("获取客户端请求的完整URL:" + url);
// 获取客户端请求的部分URL (从站点名开始,到?前面结束)
String uri = request.getRequestURI();
System.out.println("获取客户端请求的部分URI:" + uri);
// 获取请求行中的参数部分
String queryString = request.getQueryString();
System.out.println("获取请求行中的参数部分:" + queryString);
// 获取客户端的请求方式
String method = request.getMethod();
System.out.println("获取客户端的请求方式:" + method);
// 获取HTTP版本号
String protocol = request.getProtocol();
System.out.println("获取HTTP版本号:" + protocol);
// 获取webapp名字 (站点名)
String webapp = request.getContextPath();
System.out.println("获取webapp名字:" + webapp);
//获取参数
// 获取指定名称的参数,返回字符串
String uname = request.getParameter("uname");
System.out.println("uname的参数值:" + uname);
// 获取指定名称参数的所有参数值,返回数组
String[] hobbys = request.getParameterValues("hobby");
System.out.println("获取指定名称参数的所有参数值:" + Arrays.toString(hobbys));
5.2 请求乱码问题
5.2.1 Request请求乱码
原因:
目前使用的是默认的编码格式(ISO-8859-1),此编码格式不支持中文
Get
tomcat7版本以及之前版本 会出现乱码
tomcat8版本以上版本 不会出现乱码
解决方式:
new String(request.getParameter(“参数”).getBytes(“ISO-8859-1”),“UTF-8”);
Post
tomcat7版本以及之前版本 会出现乱码
tomcat8版本以上版本 会出现乱码
解决方案:
1.new String(request.getParameter(“参数”).getBytes(“ISO-8859-1”),“UTF-8”);
2.request.setCharacterEncoding(“UTF-8”);
5.3 请求转发
服务端行为,页面中的饿url地址栏不发生改变,内容变化,从始至终只有一次请求
请求转发,是一种服务器的行为,当客户端请求到达后,服务器进行转发,此时会将请求对象进行保存,地址栏中的 URL 地址不会改变,得到响应后,服务器端再将响应发送给客户端,从始至终只有一个请求发出。
//获取参数
String uname = request.getParameter("uname");
System.out.println(uname);
//请求转发到页面
if(uname.equals("admin")){
request.getRequestDispatcher("index.html").forward(request,resp);
}else{
request.getRequestDispatcher("login.jsp").forward(request,resp);
}
5.4 request作用域
通过该对象可以在一个请求中传递数据,作用范围:在一次请求中有效,即服务器跳转有效。
一般用于前后台交互,后台响应数据给客户端(设置域对象),客户端获取域对象显示数据(获取域对象)
5.4.1 设置域对象内容
request.setAttribute(String name, String value);
5.4.2 获取域对象内容
request.getAttribute(String name);
5.4.3 删除域对象内容
request.removeAttribute(String name);
6.HttpServletResponse对象
6.1 响应数据
getWriter(); 得到字符流(只能输出字符)
getOutputStream(); 得到字节流(可以输出任意内容)
只有使用其中一个,不能同时使用两个
6.2 乱码问题
response对象乱码问题
原因:
getWriter(); 得到字符流(只能输出字符)
会出现乱码问题 写出的编码格式默认是ISO-8859-1,不具备使用中文功能
getOutputStream(); 得到字节流(可以输出任意内容)
可能会出现乱码问题 需要让客户端的编码格式与服务端的编码格式一致
解决方案:
设置服务端的编码格式
response.setCharacterEncoding(“UTF-8”);
设置客户端的编码格式
response.setHeader(“content-type”,“text/html;charset=utf-8”);
上面两个一起使用
同时设置客户端和服务端的编码格式
response.setContentType(“text/html;charset=utf-8”);
6.3 response 重定向
与request请求转发之间的区别
1.请求转发是服务端行为,重定向是客户端行为
2.请求转发地址栏不发生改变,重定向会发生改变
3.请求转发地址栏发送 1次请求,重定向会发送 2次请求
4.请求转发的数据(requset)可以共享,重定向不共享数据
5.请求转发的起始路径是从当前项目开始的,所以不能跳转到百度以及外网
重定向的起始路径是http://开始的,所以跳转到百度以及外网