/** Model1: jsp ---> 显示页面 业务逻辑 javaBean Model2 jsp-->页面显示 servlet -->业务逻辑 javaBean servlet: 01.实现类servlet接口的类 就是 servlet ! 我们常认为的! 02.就是一个servlet接口! 实现servlet的三种方式 01.实现Servlet接口 02.继承GenericServlet 03.继承 HttpServlet 常用的 HttpServlet--》继承GenericServlet--》实现Servlet接口 servlet的生命周期: 1.客户端发送请求---》servlet 2.根据用户的请求 查询对应的servlet 3.加载servlet到内存中 4.servlet实例化--》调用init()初始化servlet 5.根据用户的请求方式,service()来派发到不同的方法处理(doGet(),doPost()) 6.服务器关闭,执行destroy()销毁servlet */
sevlet的功能:
01.接收用户的请求 post get 文件上传 下载
02.处理请求 取得前台的值 调用后台service层的代码
03.返回响应 重定向 转发 错误界面
/* * 实现servlet的三种方式 * 01.实现Servlet接口 * 02.继承GenericServlet抽象类 * 03.继承HttpServlet抽象类 常用的方式 * * HttpServlet 继承 GenericServlet * GenericServlet 实现 Servlet 接口 * * * HttpServletRequest 继承了 ServletRequest * HttpServletResponse 继承了 ServletResponse */ public class MyServlet extends HttpServlet { //常用的方式 @Override public void init(ServletConfig config) throws ServletException { System.out.println("初始化信息 Init 项目启动的时候不会初始化 " + "用户访问servlet的时候实例化 只被 执行一次"); } @Override public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("派发器 用户每请求一次,就会执行一次,接收用户的请求时get还是post"); super.service(request, response); //必须是 调用 父类的service方法 否则 死循环! } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("这是一个DoGet请求 只要是get请求 每次都执行"); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("这是一个DoPost请求 "); } @Override public void destroy() { System.out.println("关闭服务器的时候 销毁 destroy 只被 执行一次"); } }
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <!--配置servlet --> <servlet> <!-- 定义servlet --> <servlet-name>myServlet</servlet-name> <servlet-class>cn.bdqn.servlet.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>myServlet</servlet-name> <url-pattern>/myServlet</url-pattern> <!-- 控制用户的请求路径 --> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <form action="myServlet" method="post"> <button type="submit">提交</button> </form> </body> </html>
运行之后后台的输出结果
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <!--配置servlet --> <servlet> <!-- 定义servlet --> <servlet-name>myServlet</servlet-name> <servlet-class>cn.bdqn.servlet.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>myServlet</servlet-name> <url-pattern>/jsp/</url-pattern> <!-- 控制用户的请求路径 --> </servlet-mapping> <!-- url-pattern的四种匹配模式 / 代表项目的根目录 01.精确匹配 /myServlet ==> localhost:8080/项目名/myServlet 02.全局匹配 /* 匹配到项目下的 所有请求 localhost:8080/项目名/sasasa 能匹配 localhost:8080/项目名/1234 能匹配 03.后缀匹配 *.do 前面不管输入的是什么,但是必须有.do 04.目录匹配 /jsp/* ===》localhost:8080/项目名/jsp/随便输入 --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
<!--配置servlet --> <servlet> <!-- 定义servlet --> <servlet-name>myServlet</servlet-name> <servlet-class>cn.bdqn.servlet.MyServlet</servlet-class> <!--初始化需要的参数信息 --> <init-param> <param-name>name</param-name> <param-value>小黑</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>myServlet</servlet-name> <url-pattern>/MyServlet</url-pattern> <!-- 控制用户的请求路径 --> </servlet-mapping>
@Override public void init(ServletConfig config) throws ServletException { String initParameter = config.getInitParameter("name"); System.out.println("初始化的参数是:"+initParameter); System.out.println("初始化信息 Init 项目启动的时候不会初始化 " + "用户访问servlet的时候实例化 只被 执行一次"); }
现在我们在MyServlet中可以访问初始化的参数了!
但是如果后续我又创建了其他的Servlet,我还想用到初始化参数,而且初始化参数都是一致的! 怎么办?难道在每个servlet节点下面都创建init-param吗?
不需要 我们只需要 配置 context-param节点
<!--初始化ServletContex的参数信息 所有的servlet共享的参数 --> <context-param> <param-name>name</param-name> <param-value>小黑</param-value> </context-param>
public class MyServlet2 extends HttpServlet { /* * ServletContext:多个servlet共享的资源! * 如果我们把每一个Servlet当成一个局部变量, * 那么ServletContext就是一个全局的! */ @Override public void init(ServletConfig config) throws ServletException { String initParameter = config.getServletContext().getInitParameter("name"); System.out.println("MyServlet2初始化的参数是:"+initParameter); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String initParameter =request.getServletContext().getInitParameter("name"); System.out.println("MyServlet2初始化的参数是:"+initParameter); System.out.println("这是一个DoGet请求 只要是get请求 每次都执行"); } }
@Override public void init(ServletConfig config) throws ServletException { String initParameter =config.getServletContext().getInitParameter("name"); System.out.println("MyServlet初始化的参数是:" + initParameter); System.out.println("MyServlet初始化信息 Init 项目启动的时候不会初始化 " + "用户访问servlet的时候实例化 只被 执行一次"); }
在浏览器中 分别输入两个servlet的地址,查看效果 都会获得初始化的参数