欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

servlet

程序员文章站 2022-06-03 10:32:20
...

servlet介绍

概念

  • Servlet它是JavaWEB三大组件(Filter/Listener)之一,也是最重要的一个
  • 它是一个接口(规范),servlet是运行在 Web服务器中的小型 Java程序
  • servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web客户端的请求

servlet作用

  • 获取请求数据
  • 处理请求
  • 完成响应

实现Servlet的方式

  • 实现Servlet接口,并实现该接口下指定的5个方法
  • 继承Servlet的已知实现类GenericServlet(抽象类),那么必须实现抽象方法 service(ServletRequest request,ServletResponse response)
  • 继承Servlet的已知实现类HttpServlet(抽象类),根据需要(如果是get请求,书写doGet方法;如果是post请求,书写doPost方法)重写doXXX方法!

如何使用

入门案例

编写HelloServlet类:

package com.itheima.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class HelloServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("请求已经收到");
	}

}

 web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<display-name>web_day34</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
	<!-- 注册servlet -->
	<servlet>
		<!-- servlet-name:给当前的servlet起个名字 全局唯一 -->
		<!-- servlet-class: servlet的全限定类名 -->
		<servlet-name>HelloServlet</servlet-name>
		<servlet-class>com.itheima.servlet.HelloServlet</servlet-class>
	</servlet>
	
	<!-- servlet-mapping:绑定路径 -->
	<servlet-mapping>
		<!-- servlet-name: 使用上面起好的名字,建议复制过来 -->
		<servlet-name>HelloServlet</servlet-name>
		<!-- url-pattern:访问路径,要求:必须以“/”开头,唯一 -->
		<url-pattern>/HelloServlet</url-pattern>
	</servlet-mapping>
</web-app>

访问路径:

http://localhost:8080/web_day34/HelloServlet

执行结果:

servlet

servlet执行流程

servlet

servlet体系结构

servlet

servlet生命周期

生命周期

一个对象的创建到销毁

创建的问题

但凡与Servlet相关的对象,都不是程序员自己创建的,而是由服务器容器tomcat来负责创建的

默认情况

  • 用户第一次发送请求,由服务器容器创建Servlet实例(一种类型的Servlet只会创建一个实例对象),会调用初始化方法init(ServletConfig config),该方法在整个Servlet生命周期中只会被执行一次
  • 紧接着会调用服务方法service(ServletRequest request,ServletResponse response),该方法在整个Servlet生命周期中会被调用多次(用户发送一次请求,调用一次)
  • 当正常关闭服务器或者将这个项目从服务器容器中移除的时候,调用销毁方法destory(),该方法在整个Servlet生命周期中只会被调用一次(在关闭服务器之前调用)

servlet相关配置

服务器启动时创建servlet

  • load-on-startup配置项(在web.xml文件中配置)
  • 配置一个参数load-on-startup,让servlet在服务器启动的时候就被创建以及初始化

案例

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class AServlet implements Servlet {

	@Override
	public void destroy() {

	}

	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("AServlet被初始化了……");
	}

	/**
	 * 所有用户请求的代码写在service方法中
	 */
	@Override
	public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
		// 解决浏览器乱码问题
		response.setContentType("text/html;charset=utf-8");
		// 向浏览器输出数据
		response.getWriter().write("Servlet快速入门");
		System.out.println("这是我的一个servlet程序!");
	}

	@Override
	public ServletConfig getServletConfig() {
		return null;
	}

	@Override
	public String getServletInfo() {
		return null;
	}

}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<display-name>web_day34</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
	
	<servlet>
		<servlet-name>AServlet</servlet-name>
		<servlet-class>com.itheima.servlet.AServlet</servlet-class>
		<!-- 服务器启动的时候初始化 -->
		<load-on-startup>2</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>AServlet</servlet-name>
		<url-pattern>/AServlet</url-pattern>
	</servlet-mapping>

</web-app>

 servlet

访问路径的配置

url-pattern

完全匹配

<url-pattern>/DServlet</url-pattern>

目录匹配

<url-pattern>/a/b/*</url-pattern>

只要是a目录下面的b目录下的任何内容

扩展名匹配

<url-pattern>*.do</url-pattern>

只要后缀名是.do都可以匹配到

匹配所有

<url-pattern>/*</url-pattern>

只要是这个项目下面的内容都可以匹配到这个servlet中去

缺省的

<url-pattern>/</url-pattern>

访问的内容与配置的越接近,优先级越高

ServletConfig对象

方法

public java.util.Enumeration<E>getInitParameterNames() ---得到所有初始化参数的值

public String getInitParameter(String name) ---得到指定初始化参数的值

public ServletContext getServletContext()---得到ServletContext对象

public String getServletName()  ----------返回一个servlet实例的名称

案例

package com.itheima.servlet;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class AServlet implements Servlet {

	@Override
	public void destroy() {

	}

	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("AServlet被初始化了……");

		// 获得ServletContext对象
		ServletContext servletContext = config.getServletContext();
		System.out.println(servletContext);

		String contextPath = servletContext.getContextPath();
		System.out.println(contextPath);///web_day34

		// 获得初始化参数值
		String username = config.getInitParameter("username");
		System.out.println(username);

		// 获得Servlet名称
		String servletName = config.getServletName();
		System.out.println(servletName);

		// 获得所有的初始化参数的名称
		Enumeration<String> initParameterNames = config.getInitParameterNames();
		while (initParameterNames.hasMoreElements()) {
			String key = (String) initParameterNames.nextElement();
			String value = config.getInitParameter(key);
			System.out.println(key+"\t"+value);
		}
	}

	/**
	 * 所有用户请求的代码写在service方法中
	 */
	@Override
	public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
		// 解决浏览器乱码问题
		response.setContentType("text/html;charset=utf-8");
		// 向浏览器输出数据
		response.getWriter().write("Servlet快速入门");
		System.out.println("这是我的一个servlet程序!");
	}

	@Override
	public ServletConfig getServletConfig() {
		return null;
	}

	@Override
	public String getServletInfo() {
		return null;
	}

}

 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<display-name>web_day34</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>

	<servlet>
		<servlet-name>AServlet</servlet-name>
		<servlet-class>com.itheima.servlet.AServlet</servlet-class>
		<init-param>
			<param-name>username</param-name>
			<param-value>baoqiang</param-value>
		</init-param>
		<init-param>
			<param-name>password</param-name>
			<param-value>rongrong</param-value>
		</init-param>
		<!-- 服务器启动的时候初始化 -->
		<load-on-startup>2</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>AServlet</servlet-name>
		<url-pattern>/AServlet</url-pattern>
	</servlet-mapping>

</web-app>

servlet

案例——完成登录案例

需求

在页面上输入用户名和密码,提交到服务器上,服务器拿着用户名和密码去数据库中查找有无此用户

若有用户,则提示登录成功

若无此用户,则提示用户名密码不匹配

技术分析

  • 表单
    • 收集用户数据
    • 所有的字段要想提交到服务器必须有name属性
    • 提交的地址 action
    • 请求的方式post
  • servlet
  • 请求(request)
    • request.getParameter("key");
  • 响应(response)