Servlet
1.Http协议
请求协议:客户端发送给服务端
响应协议:服务器发送给可客服端
1.1特点
简单快速,灵活,无连接,无状态
1.2URL
格式
http://host[:prot]/[abc_path]
http://IP(主机名/域名):端⼝/访问的资源路径
https://www.baidu.com
http:表示通过协议来定位网络资源
host:表示合法的主机域名或者ip地址
port:指定一个端口号,为空则默认为80
abs_path:指定请求资源的url
2.Servlet实现
运行在服务器端,由服务器调用
2.1实现Servlet规范
继承于HttpServlet类,重写 service方法
public class Servlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("你好!!!");
resp.getWriter().write("Hello!");
}
}
2.2设置注解
使⽤@WebServlet定义资源名称
@WebServlet("/hello")
2.3访问路径
http://localhost:8080/[tomcat资源名]/[类资源名]
2.4工作流程
①: 通过请求头获知浏览器访问的是哪个主机
②:再通过请求⾏获取访问的是哪个⼀个web应⽤
③:再通过请求⾏中的请求路径获知访问的是哪个资源
④:通过获取的资源路径在配置中匹配到真实的路径,
⑤:服务器会创建servlet对象,(如果是第⼀次访问时,创建servlet实例,并调⽤init⽅法 进⾏初始化 操作)
⑥: 调⽤service(request, response)⽅法来处理请求和响应的操作
⑦:调⽤service完毕后返回服务器 由服务器讲response缓冲区的数据取出,以http响应的 格式发送给 浏览器
2.5生命周期
Servlet没有 main()⽅法,不能独⽴运⾏,它的运⾏完全由 Servlet 引擎来控制和调度。
①:实例和初始化
init方法:在 Servlet 实例创建之后执⾏
//初始化,只执行一次
@Override
public void init(){
System.out.println("实例创建了");
}
②:就绪/调⽤/服务阶段
service ⽅法,每次有请求到达某个 Servlet ⽅法时执⾏,⽤来处理请求
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("你好!!!");
resp.getWriter().write("Hello!!!");
}
③:销毁时机
destroy ⽅法,Servlet 实例销毁时执⾏
//销毁,只执行一次
@Override
public void destroy(){
System.out.println("实例销毁了!");
}
3. HttpServletRequest对象
用于接收客户端发送过来的请求消息
3.1常用方法
//获取完整的URL
StringBuffer url = req.getRequestURL();
System.out.println("URL->"+url);
//获取项目名称以后的资源名称
String uri = req.getRequestURI();
System.out.println("URI->"+uri);
//获取请求行中的参数
String query = req.getQueryString();
System.out.println("Query->"+query);
//获取客户端的请求方式
String method = req.getMethod();
System.out.println("MEthod->"+method);
//获取HTTP版本号
String protocol = req.getProtocol();
System.out.println("Protocol->"+protocol);
//获取Webapp站点名称
String path = req.getContextPath();
System.out.println("Path->"+path);
获取请求的参数
//获取请求参数
//String uname = req.getParameter("uname");
String[] values = req.getParameterValues("uname");
System.out.println(Arrays.toString(values));
3.2请求乱码问题
方法一:
request.setCharacterEncoding("UTF-8");
方法二:
new String(req.getParameter("uname").getBytes("ISO-8859-1"), "utf-8");
3.3请求转发
服务器行为。从始至终只有一个请求发出,URL栏地址不会发生变化
req.getRequestDispatcher(url).forward(req,resp);
3.4request作用域
// 设置域对象内容
request.setAttribute(String name, String value);
// 获取域对象内容
request.getAttribute(String name);
// 删除域对象内容
request.removeAttribute(String name);
4. HttpServletResponse对象
用于服务器端对客户端进行请求响应
4.1响应数据
getWriter():获取字符流(只能响应回字符)
PrintWriter writer = resp.getWriter();
writer.write("Hello!!!");
writer.write("<h2>嘻嘻哈哈</h2>");
writer.flush();
writer.close();
getOutputStream():获取字节流(能响应一切数据)
ServletOutputStream os = resp.getOutputStream();
os.write("你好".getBytes());
os.write("<h2>嘻嘻哈哈</h2>".getBytes());
os.flush();
os.close();
响应HTML类型
response.setHeader("content-type","text/html");
4.2响应乱码问题
getWriter()的字符乱码
设置服务器使用一种能支持中文编码格式
resp.setCharacterEncoding("UTF-8");
还需指定客户端格式
response.setHeader("content-type", "text/html;charset=UTF-8");
getOutputStream()字节乱码
指定客户端和服务器使⽤的编码⽅式⼀致。
response.setHeader("content-type","text/html;charset=UTF-8");
// 设置客户端与服务端的编码
response.setContentType("text/html;charset=UTF-8");
4.3重定向
客户端发出第一个请求,被服务器处理后,服务器会响应,相应的同时给客户端一个新地址
sendRedirect()
//重定向到login.jsp页面
resp.sendRedirect("login.jsp");
4.4请求转发和重定向的区别
请求转发:一次请求。服务器端行为。地址栏不发生变化。绝对地址定位到资源后
重定向: 两次请求。 客户端行为。地址栏会发生变化。绝对地址可写到http://