Servlet技术
a)什么是Servlet
1、Servlet是一个接口(JavaEE规范)
2、Servlet是运行在服务器(Tomcat或其他的服务器)上的小程序。
3、Servlet程序用来接收用户的请求,和给客户端响应数据。(接收请求,回传响应)
b)手动实现Servlet程序
1、编写一个类去实现Servlet接口
2、实现接口中的service方法
3、到web.xml中去配置访问地址
Servlet程序
public class HelloServlet implements Servlet { @Override public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { System.out.println("hello world!!"); } }
web.xml中的配置:
<!-- servlet配置一个Servlet程序,给Tomcat服务器配置 --> <servlet> <!-- servlet-name给这个servlet启一个名称,一般值是类名 --> <servlet-name>HelloServlet</servlet-name> <!-- servlet-name是Servlet程序的全类名 --> <servlet-class>com.atguigu.servlet.HelloServlet</servlet-class> </servlet> <!-- servlet-mapping用来配置servlet程序的访问地址 --> <servlet-mapping> <!-- servlet-name表示给谁配置访问地址 --> <servlet-name>HelloServlet</servlet-name> <!-- url-pattern配置访问地址 地址的格式:http://ip:port/工程名/资源名 在服务器上。/ 斜杠 == 表示地址:http://ip:port/工程名/ /hello ====== 表示http://ip:port/工程名/hello 也就是说,我们在浏览器地址栏上输入访问地址: http://ip:port/工程名/hello 就可以访问这个HelloServlet程序。 如果将项目部署到服务器上默认访问的是index.html,如果没有index文件则会报错 --> <url-pattern>/hello</url-pattern> </servlet-mapping>
常见错误: servlet-name标签配置不统一
常见错误二:servlet-class标签全类名标签错误
常见错误三:url-pattern没有以斜杠打头
c)解析url到servlet访问细节
d)Servlet的生命周期(了解内容,面试)
1 先执行Servlet的构造器
2 执行init初始化方法
工程启动之后,我们第一次访问Servlet程序的时候执行 1 和 2两个步骤
3 执行service 业务方法
每次调用都会执行service方法
4 执行destroy销毁方法
当web工程停止的时候(重新部署)
e)模拟GET请求和POST请求的分发
public class HelloServlet implements Servlet { /** * service方法是业务处理方法,每次请求都会调用 */ @Override public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { // System.out.println("3 service业务处理方法"); // 想办法知道到底请求进来到底是GET。还是POST HttpServletRequest httpRequest = (HttpServletRequest) request; //getMethod 可以获取请求的方式,GET或POST String method = httpRequest.getMethod(); // System.out.println( method ); // 可能一般GET请求,和POST请求,需要做的工作不同 if ("GET".equals(method)) { // 做GET请求的处理 doGet(); } else if ("POST".equals(method)) { // 做POST请求的处理 doPost(); } } public void doGet() { System.out.println("这是GET请求的功能"); } public void doPost() { System.out.println("这是POST请求的功能"); } }
f)通过继承HttpServlet实现Servlet程序
在开发的时候。为了让开发代码更佳简洁,方便,然后规范中提供了一个类叫HttpServlet类。
我们只需要继承HttpServlet类,就可以实现Servlet程序了
1、编写一个类去继承HttpServlet
2、重写doGet或doPost方法
3、去web.xml中去配置请求地址
源代码:
public class HelloServlet2 extends HttpServlet { /** * doGet方法,在请求进来 是GET请求的时候,调用 */ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("这是继承HttpServlet 实现的 GET功能"); } /** * doPost方法,在请求进来 是POST请求的时候,调用 */ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("这是继承HttpServlet 实现的 POST功能"); } }
web.xml中的配置:
<servlet> <servlet-name>HelloServlet2</servlet-name> <servlet-class>com.atguigu.servlet.HelloServlet2</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet2</servlet-name> <!-- 在服务器中 / 斜杠 ===== 表示http://ip:port/工程名/ /hello2 ===>>>> http://ip:port/工程名/hello2 --> <url-pattern>/hello2</url-pattern> </servlet-mapping>
表单:
<form action="http://localhost:8080/day06/hello2" method="post"> <input type="submit" /> </form>
g)使用Eclipse创建Servlet程序
Servlet类的继承体系
ServletConfig类
ServletConfig类从类名中就感觉它是Servlet程序的配置信息。
这个ServletConfig只能由Tomcat服务器负责创建。每次Tomcat创建Servlet程序的时候,就会创建ServletConfig对象,然后调用init初始化方法进行初始化操作。
a)ServletConfig类的三大作用
1、获取在web.xml中配置的Servlet-name的别名
2、获取在web.xml中配置的初始化参数init-param
3、获取ServletContext对象
源代码:
public class ConfigServlet extends HttpServlet { public void init(ServletConfig config) throws ServletException { // 1、获取在web.xml中配置的Servlet-name的别名 System.out.println("servlet-name的值:" + config.getServletName()); // 2、获取在web.xml中配置的初始化参数init-param System.out.println("初始化参数user的值:" + config.getInitParameter("user")); System.out.println("初始化参数url的值:" + config.getInitParameter("url")); // 3、获取ServletContext对象 System.out.println( config.getServletContext() ); } }
web.xml中的配置:
<servlet> <servlet-name>ConfigServlet</servlet-name> <servlet-class>com.atguigu.servlet.ConfigServlet</servlet-class> <!-- init-param 配置配置初始化参数(由键值对组成) --> <init-param> <!-- param-name是参数名 --> <param-name>user</param-name> <!-- param-value是参数值 --> <param-value>root</param-value> </init-param> <!-- init-param 配置配置初始化参数(由键值对组成) --> <init-param> <!-- param-name是参数名 --> <param-name>url</param-name> <!-- param-value是参数值 --> <param-value>jdbc:mysql://localhost:3306/test</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>ConfigServlet</servlet-name> <url-pattern>/configServlet</url-pattern> </servlet-mapping>
注意点:
ServletContext类
a)什么是ServletContext?
1、ServletContext是一个接口
2、ServletContext在一个web工程中只有一个对象实例(Tomcat服务器负责创建)。
3、ServletContext是一个域对象。
什么是域对象?
域对象是可以像map一样存取数据的对象
setAttribute 保存数据 put
getAttribute 获取数据 get
removeAttribute 删除数据 remove
域指的是这些存取的数据的操作范围。ServletContext对象的数据操作范围是整个web工程。
ServletContext对象在web工程启动的时候创建。在web工程停止的时候销毁。
b)ServletContext类的四个作用
1、获取在web.xml中配置的上下文初始化参数 context-param
2、获取工程路径地址
3、获取工程发布之后在服务器上的绝对路径
4、像map一样存取数据。
ServletContext作用的演示源代码:
public class ContextServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取ServletContext对象 ServletContext servletContext = getServletContext(); // 1、获取在web.xml中配置的上下文初始化参数 context-param String password = servletContext.getInitParameter("password"); String url = servletContext.getInitParameter("url"); System.out.println( "上下文参数password的值:" + password ); System.out.println( "上下文参数url的值:" + url ); // 2、获取工程路径地址 System.out.println("当前工程路径是:" + servletContext.getContextPath()); // 3、获取工程发布之后在服务器上的绝对路径 // / 斜杠表示到http://ip:port/工程名/ 映射到代码的webContent目录 // getRealPath 获取在服务器上的绝对路径。 System.out.println( "/ 根 的绝对路径是:" + servletContext.getRealPath("/") ); System.out.println("/css的绝对路径是:" + servletContext.getRealPath("/css")); System.out.println("/imgs/11.jpg的绝对路径是:" + servletContext.getRealPath("/imgs/11.jpg")); System.out.println( servletContext.getRealPath("/1.js") ); } }
web.xml配置文件内容:
<context-param> <param-name>password</param-name> <param-value>root</param-value> </context-param> <context-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost:3306/contextServlet</param-value> </context-param>
像map一样存取数据:
Context1的代码:
public class Context1 extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext context = getServletContext(); System.out.println( context ); // 获取属性值: System.out.println("在保存属性前 Context1 里获取abc的属性值:" + context.getAttribute("abc")); context.setAttribute("abc", "麦当劳是谁开的?麦当娜开的!因为他们都姓麦!"); System.out.println("在保存属性后 Context1 里获取abc的属性值:" + context.getAttribute("abc")); } }
Context2的代码:
public class Context2 extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext context = getServletContext(); System.out.println( context ); // 获取属性值: System.out.println("Context2 里获取abc的属性值:" + context.getAttribute("abc")); } }