目录
一、什么是Servlet
server Applet (Java连接器),针对服务端的程序的开发(服务端的连接器)
java语言编写的服务端程序,(controller控制器),能够前台页面进行交互的浏览器和生成数据,产生web内容。
二、Servlet本质
servlet 狭义的规范:接口,实现Servlet接口的普通类
广义的规范:自定义一个类继承自Servlet接口的抽象类HttpServlet
三、使用步骤:xml配置方式
1)导入servlet - api.jar包,(ee规范的:HttpServlet/Servet接口) /jsp-api.jar(支持jsp格式)
2)在src下创建一个类 MyServlet,继承HttpServllet (javax.servlet.http.HttpServlet)
重写doGet和doPost方法
doGet()---->接收get提交(用户直接在浏览器地址栏默认都是 get)
doPost()--->接收post提交
3)编写后台的业务处理doGet()....
调用service层-----进行业务功能实现
调用dao层:完成jdbc操作
3)重写HttpServlet的doGet():执行前台get请求的提交/doPost()方法,执行前台post提交
4)需要在当前web工程WEB-INF的web.xml文件配置servlet
<!--servlet的基本配置-->
<servlet>
<!--servlet的名称-->
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.qf.servlet_01.MyServlet</servlet-class>
</servlet>
<!--servlet的映射配置 访问的请求路径-->
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<!--映射路径必须以"/指定的路径"-->
<url-pattern>/myFirst</url-pattern>
</servlet-mapping>
5)访问路径 http://localhost:8080/Web_02/myFirst -- URL(URL 属于URI子集)
/Web_02/myFirst -- URI
四、Servlet执行流程
1)Web客户端向服务器发送请求 http://loclhost:8080/web工程名称/hello
2)服务器接收请求,解析访问路径uri: /web工程/hello
找当前web工程是否存在url-pattern为"/hello",web.xml去查找
3)如果找不到,404---->找不到路径
如果找到了,解析servlet-mapping 获取url-pattern对应的servlt-name
在通过servlt-name找servlet的基本配置里面servlet-class : 当前servlet的全限定名称:包名.类名
4)反射的方式Class.forName("包名.类名")--->Class clazz
5)创建当前类实例----clazz.newIntance()---->Object obj
6)获取当前字节码文件对象中Method类对象
Method method = clazz.getDeclaredMethod("doGet()",HttpServletRequest.class,HttpServletResponse.class) ;
7)调用方法
method.setAccessiable(true) ;
method.invoke(obj,request,response) ;
浏览器做的事
1)启动tomcat
2)浏览器发送请求到服务器 HttpServletRequest
服务器做的事
1)tomcat解析请求的路径的URI地址
2)进入到web工程WEB-INF的web.xml文件(tomcat解析xml文件)是否存在
<url-pattern>/myFirst</url-pattern>
3)如果存在,找到了,就获取当前映射路径中对应的<servlet-name>MyServlet</servlet-name>
4)通过映射配置获取对应的servlet配置
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.qf.servlet_01.MyServlet</servlet-class>
5)解析servlet-class ---->com.qf.servlet01.MyServlet
6)反射
Class class = Class.forName(“com.qf.servlet01.MyServlet”);
7)创建当前实例
clazz.newInstance()--->Object obj
8)获取Method类对象
Method method = clazz.getDeclaredMethod("doGet",HttpServletRequest.class,HttpServletResponse.class);
9)调用方法
method.invoke(obj,response);
10)对浏览器进行相应HttpServeltResponse
1、创建MyServlet类,全限定名称 com.qf.servlet_01.MyServlet
public class MyServlet extends HttpServlet{
@Override
//Http协议:在请求的时候就创建了,服务器响应的时候就创建了
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1)访问servlet---给tomcat发送请求
//2)tomcat需要给浏览器进行响:将响应数据封装到HttpServletResponse 响应对象解决响应的中文乱码
//void setContentType(String var1);
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("hello,这是我第一个Servlet");
}
//执行post提交
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(req,resp);
}
}
2、WEB-INF/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_4_0.xsd"
version="4.0">
<!--servlet的基本配置-->
<servlet>
<!--servlet的名称 当前类名 -->
<servlet-name>MyServlet</servlet-name>
<!-- 指定当前servlet的全限定名称 -->
<servlet-class>com.qf.servlet_01.MyServlet</servlet-class>
</servlet>
<!--servlet的映射配置 访问的请求路径-->
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<!--映射路径必须以"/指定的路径"-->
<url-pattern>/myFirst</url-pattern>
</servlet-mapping>
</web-app>
五、Servlet的体系结构
Servlet接口
public void service(ServletRequest req, ServletResponse res)
抽象的GenericServlet 子实现类 Servlet方法没有被重写
public void service(ServletRequest req, ServletResponse res)
抽象的HttpServlt类 ,子实现类
servlet方法被重写,获取了请求方式String nothod doGet()/doPost();
public void service(ServletRequest req, ServletResponse res) {
//获取前提的提交方式
//public String getMethod()
String method = req.getMethod() ;
//选择结构语句判断
if(method.equals("GET")){
..
doGet(req,res) ;
}else if(method.equals("POST")){
doPost(req,res) ;
}
}
xxxServlet继承自HttpServlet
doGet()/doPost()
Myservlet:自定义类---具体类
六、Setvlet生命周期
1、生命周期
public void init(ServletConfig config) throws ServletException :初始化 web容器对当前servlet进行数据初始化
public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException :业务调用方法(web客户端发送请求,web容器(tomcat)调用这个方法解析请求)
public void destroy():servlet销毁,当前web容器(tomcat)正常关闭或者服务器(Linux:安装tomcat)停止了都会造成销毁
2、Servlet的是一个单例的,线程不安全
当前我们定义的servlet就被创建一次,初始化也是一次
service方法是业务方法方法,不断被调用,因为我们使用具体的get提交还是post提交,覆盖的应该具体的doXXX()方法
3、简单代码
public class ServletLife extends HttpServlet {
/**
* 提供无参构造方法
*/
public ServletLife(){
System.out.println("servletLife对象被创建了...");
}
@Override
public void init(ServletConfig config) throws ServletException {
//ServletConfig:接口 servlet的配置对象:每一个servlet都会自己的配置对象:
// 获取servlet名称以及当前servlet的初始化参数
System.out.println("servletLife初始化了...");
}
//servlet入口:业务方法服务方法
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("程序的入口service方法被调用了...");
}
//servlet销毁
@Override
public void destroy() {
System.out.println("当前servlet被销毁了...");
}
}
七、get提交与post提交
1、区别
1)get提交与post提交后台接数据相同,所以后台在doPost将doGet()复用(get提交方式居多)或者是在doGet()/复用doPost
2)get提交tomcat8.0不会出现中文乱码(优化了)
post提交tomcat8.0必须解决中文乱码
2、调用到的方法
//HttpServletRequest接口
String getParameter(String var1);接收前台提交过来的参数 (在doPost通用) 通过参数名称获取参数值
Enumeration<String> getParameterNames(); 获取所有的参数名称
前提要求:必须在页面上指定name属性的属性值:给后台标记内容
3、基本实现步骤
public class GetArgsServlet extends HttpServlet {
//doGet:接收get提交参数
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//或
//一次获取单个参数
String username = request.getParameter("username");
System.out.println("username:"+username);
String password = request.getParameter("password");
System.out.println("password:"+password);
String email = request.getParameter("email");
System.out.println("email:"+email);
//主
//Enumeration<String> getParameterNames(); 枚举方法
Enumeration<String> enums = request.getParameterNames();
while(enums.hasMoreElements()){
//获取下一个元素
String parameterName = enums.nextElement();
//在通过参数名称获取参数值
String value = request.getParameter(parameterName);
System.out.println(parameterName+"----"+value);
}
}
//接收post提交
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//将doGet()复用
doGet(request,response);
//或
//一次获取单个参数
//String getParameter(String var1);接收前台提交过来的参数
String username = request.getParameter("username");
System.out.println("username:"+username);
String password = request.getParameter("password");
System.out.println("password:"+password);
String email = request.getParameter("email");
System.out.println("email:"+email);
// Enumeration<String> getParameterNames();
Enumeration<String> enums = request.getParameterNames();
while(enums.hasMoreElements()){
//获取下一个元素
String parameterName = enums.nextElement();
//在通过参数名称获取参数值
String value = request.getParameter(parameterName);
System.out.println(parameterName+"----"+value);
}
}
}
4、解决乱码问题
doPost()必须解决前提提交的中文乱码
doget()不需要解决中文乱码,tomcat8.0以后优化了
基本实现步骤
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
* doPost()必须解决前提提交的中文乱码
* doget()不需要解决中文乱码,tomcat8.0以后优化了
* */
public class ServletResolveEncoding extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//解决post提交乱码
request.setCharacterEncoding("utf-8");
//解决响应给浏览器的中文乱码
response.setContentType("text/html;charset=utf-8");
//获取前提提交参数:中文格式
//获取用户名
String username = request.getParameter("username");
System.out.println("username:"+username);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//HttpServletReuqest它的父接口中有就这个方法
//void setCharacterEncoding(String var1) throws UnsupportedEncodingException;
/* request.setCharacterEncoding("utf-8");*/
//获取前提提交参数:中文格式
//或 //获取用户名
String username = request.getParameter("username");
System.out.println("username:"+username);
doGet(request,response);
}
}
八、Servlet的注解方式有哪些常用属性
@WebServlet(urlpatterns={"/xxx"},name="当前Servlet名称")
String[] value() ; //配置映射路径 如果只是书写这一个属性,而且名称就是value(value="/xx"),value可以省略("/xx")
String[] urlPatterns(); //配置多个映射路径,如果只是配置一个映射路径 (urlpatterns={"/xxx"})
String loadOnstratUp(); 配置Servlet的初始化数据 (1:优先级最大)
String name():指定当前servlet名称,也可以省略(默认就是当前类名)
WebInitParam[] initParams():配置当前servlet的初始化参数