1. HTTP协议
http: 区别客户端
特点:
1.简单快捷
2.灵活
3.无连接
4.无状态
URL(重点): 统一资源定位符
例如:http://www.baidu.com:8080/index.html?s=java
http: 协议,例如 https ftp jdbc file
www.baidu.com 域名,或者写ip地址
:8080 端口号
index.html 文件
?s=java 参数
2. Servlet(重点)
工作机制:
1.客户端通过电脑网页发送HTTP请求到web服务器——Tomcat;
2.此时请求的servlet没有初始化,Tomcat从磁盘中加载Servlet,磁盘中存放的是Servlet架包;
3.Servlet加载成功,解析HTTP请求为request对象;
4.转发request请求到相应的servlet处理;
5.servlet处理后返回response;
6.Tomcat将response转换为HTTP响应;
7.Tomcat返回HTTP响应给客户端。
2.1 Servlet简介
server applet Java的服务器小程序
功能:完成HTML和Java后端的交互
核心类和核心接口:
包:javax.servlet
javax.servlet.http
类:ServletException
HttpServlet
Cookie
Session
GenericServlet(核心)
接口:HttpServletRquest
HttpServletResponse
Servlet(核心)
2.2 Servlet 初识‘
package com.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;
import java.io.PrintWriter;
//注解 与URL有关 请求
@WebServlet("/Servlet-01")
public class Servlet01 extends HttpServlet {
/**
* 处理Post的请求
* request 请求
* response 响应
* ServletException 抛出的异常
* */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
/**
* 处理Get的请求
* request 请求
* response 响应
* ServletException 抛出的异常
* */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//处理乱码
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
//在页面显示 返回一个PrintWriter对象
response.getWriter().append("<font color='red' size='7'>hr</font>");//append 附加
response.getWriter().append("<font color='red' size='7'>哇哦</font>");
response.getWriter().append("<font color='red' size='7'>哇哦</font>");
}
}
2.3 Servlet的核心接口和类
2.3.1 核心接口 Servlet
public class TestServlet implements Servlet {
//想要使用Servlet类对象 初始化当前的servlet的程序
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
//获取当前ServletConfig的对象(Servlet的配置对象)
@Override
public ServletConfig getServletConfig() {
return null;
}
//Servlet的一个服务方法,认为是doGet doPost
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
//几乎不用,了解
@Override
public String getServletInfo() {
return null;
}
//Servlet程序销毁
@Override
public void destroy() {
}
}
2.4 Servlet的三种创建方式
2.4.1 第一种(自定义Servlet 实现 Servlet接口的)(以后不会用)
package com.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/TestServlet")
public class TestServlet implements Servlet {
//想要使用Servlet类对象 初始化当前的servlet的程序
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init方法...");
}
//获取当前ServletConfig的对象(Servlet的配置对象)
@Override
public ServletConfig getServletConfig() {
System.out.println("getServletConfig...");
return null;
}
//Servlet的一个服务方法,认为是doGet doPost
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service...");
//处理乱码
servletResponse.setCharacterEncoding("UTF-8");
servletResponse.setContentType("text/html;charset=utf-8");//设置响应的文本内容字符集
servletResponse.getWriter().append("哇哦");
}
//几乎不用,了解
@Override
public String getServletInfo() {
return null;
}
//Servlet程序销毁
@Override
public void destroy() {
System.out.println("destroy方法...");
}
}
2.4.2 第二种(自定义servlet类继承GenericServlet)
package com.servlet;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/TestGenericServlet")
public class TestServlet2 extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service...");
servletResponse.setContentType("text/html;charset=utf-8");
servletResponse.getWriter().append("hello");
}
}
2.4.3 第三种(自定义Servlet类继承HttpServlet,常用)
package com.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;
@WebServlet("/TestHttpServlet")
public class TestServlet3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost");
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().append("哇哦");
}
}
总结:
为什么用HttpServlet?
1.可以减少对其他方法处理的要求,其他方法对业务影响不大;
2.可以根据HTTP请求方式对应请求的响应;
doGet select 查询
doPost insert delete update
2.5 Servlet两种配置方式
2.5.1 web.xml的配置,通用于所有servlet的版本
TestXMLServlet
package com.servletxml;
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 TestXMLServlet extends HttpServlet {
public TestXMLServlet(){}
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost...");
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().append("哈哈哈");
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- servlet的配置 -->
<servlet>
<display-name>TestXMLServlet</display-name>
<!-- servlet-name 要与 servlet-mapping 中的 servlet-name 保持一致 -->
<servlet-name>TestXMLServlet</servlet-name>
<!-- servlet程序所对应的类 -->
<servlet-class>com.servletxml.TestXMLServlet</servlet-class>
<!-- 服务器启动的时候就加载 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>TestXMLServlet</servlet-name>
<!-- 访问路径URL -->
<url-pattern>/TestXmlServlet</url-pattern>
</servlet-mapping>
</web-app>
2.5.2 注解的一种写法(版本必须是3.0以上)
@WebServlet(name = “TestAnnocation”,urlPatterns = {"/TestAnnocation","/Annocation1","/Annocation2"},loadOnStartup = 1)
参数:
name == servlet --> servlet-name
urlPatterns == url-pattern
loadOnStartup == load-on-startup
package com.servletxml;
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;
/**
* name == servlet --> servlet-name
* urlPatterns == url-pattern
* loadOnStartup == load-on-startup
* */
@WebServlet(name = "TestAnnocation",urlPatterns = {"/TestAnnocation","/Annocation1","/Annocation2"},loadOnStartup = 1)
public class TestAnnocation extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("注解----doPost...");
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().append("耶啵<br/>");
resp.getWriter().append("赞赞<br/>");
}
}
2.6 Servlet的生命周期
执行流程:
阶段1:constructor,servlet对象实例化,创建出servlet实例对象,提供给Tomcat使用;
阶段2:init,使用init,初始化ServletConfig对象里的参数;
阶段3:service,当前的servlet对外提供服务;
阶段4:destroy,servlet的销毁
package com.servletlife;
import javax.servlet.ServletConfig;
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;
@WebServlet("/Life.do")
public class ServletLife extends HttpServlet {
public ServletLife(){
System.out.println("构造方法");
}
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
System.out.println("init方法...");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("service...");
//没有响应,所以会报405 错误
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().append("service");
}
@Override
public void destroy() {
super.destroy();
System.out.println("destroy...");
}
}
2.7 获取请求参数
package com.loginservlet;
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;
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//防止乱码
req.setCharacterEncoding("utf-8");
//请求参数
String user = req.getParameter("user");
String pwd = req.getParameter("pwd");
System.out.println(user + "," + pwd);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}