1. Servlet

1.1 Servlet概述

java EE Api
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
在这里插入图片描述

1.2 Servlet的使用

编写一个Java类实现Servlet接口—>重写service()方法;
在web.xml中配置这个类(方便服务器识别并执行和访问)。

配置web.xml:
		配置servlet的名称:
		<servlet>
			<servlet-name>servlet的名称</servlet-name>
			<servlet-class>Servlet类的全路径</servlet-class>
		</servlet>
		配置Servlet的映射
		<servlet-mapping>
			<servlet-name>servlet的名称</servlet-name>
			<url-pattern>/访问路径</url-pattern>
		</servlet-mapping>
Servlet快速入门

伪登录:登录界面点击登录提交账号密码到Servlet,Servlet将获取到的数据打印到控制台。

实现步骤:

1、设计登录页面,login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
	<form action="login" method="get">
		账号:<input type="text" name="username" ><br/>
		密码:<input type="password" name="password" ><br/>
		<input type="submit" value="登录" >
	</form>
</body>
</html>

2、创建登录的Servlet,LoginServlet.java,重写service()方法

package com.offcn.servlet;

import java.io.IOException;

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

public class LoginServlet implements Servlet{

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getServletInfo() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
		String name = request.getParameter("username");	
		String password = request.getParameter("password");
		System.out.println("用户名:"+name+"  密码:"+password);
	}
	
}

3、配置Servlet,在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_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>Edu-10</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-name>LoginServlet</servlet-name>
        <!--Servlet的全路径 -->
  	<servlet-class>com.offcn.servlet.LoginServlet</servlet-class>
  </servlet>
        <!--配置Servlet的映射(访问)路径 -->
  <servlet-mapping>
  	<servlet-name>LoginServlet</servlet-name>
         <!--Servlet的映射路径,配置时前面一定要加/,代表根目录 -->
        <!--此时设置login.html中的action属性的值与此处的值一样-->
  	<url-pattern>/login</url-pattern>
  </servlet-mapping>
</web-app>

4、测试:

运行login.html,输入账号和密码,点击登录,注意浏览器的变化和控制台的输出

1.3 Servlet的执行流程(前后台交互原理)

在浏览器的地址栏中输入地址—>浏览器向服务器发送请求—>服务器根据配置在中找到访问路径名—>通过这个路径找到在同一个标签中的—>根据这个名称到标签中的同名的—>在根据这个name找到同标签下的类的全路径—>找到Java代码中的这个类,执行里面的service方法,向浏览器端做出响应。
在这里插入图片描述

1.4 Servlet的实现关系

Servlet接口
|
|
GenericServlet类 通用的Servlet,是一个与协议无关的Servlet
|
|
HttpServlet类 Http专用的Servlet

实际使用中,一般让这个Servlet继承HttpServlet,重写service()方法;
继而发现service方法内部会根据请求方式的不同来调用相应的方法do***(),所以继承HttpServlet后直接重写doGet方法或者doPost方法,并且这两者可相调用以简化编程。
在这里插入图片描述

总结:基于HTTP协议的web项目中的Servlet直接继承HttpServlet即可
1.5 Servlet与Tomcat之间的关系

1、Tomcat在初始化Servlet时,会自动读取web.xml文件中相关的配置信息,初始化ServletConfig和ServletContext,同时会创建ServletRequest和ServletResponse对象直接交给Servlet实例,这样一来,Servlet就拥有了相关的功能。

2、doGet与doPost方法
请求到来时,自动调用的依然是service(),但是在该方法中,根据请求方式的不同,调用对应的do***(),而这些do***()在自己的Servlet中又重写了,所以,运行的就是自己写的do***()中的代码。

什么时候调用doGet
1)form表单的method属性值为get
2)form表单的method属性未给值
3)通过超链接请求
4)直接通过路径访问Servlet

什么时候调用doPost
1)form表单的method属性值为post

form表单中get方式与post方式的区别
1、get方式,提交的数据将会直接被拼接到地址栏中;post不会
2、get方式提交的数据量较少;post相对而言多一些
3、get方式提交的数据会被浏览器直接缓存;post不会

总结:get不安全的,post相对而言要安全一些。提交的数据量小且不需要保密时使用get,反之使用post

1.6 servlet生命周期
servlet的生命周期是指servlet对象从创建到销毁的过程,这个过程包括了初始化,服务和销毁三个阶段,对应的方法是init、service和destroy。
(1)servlet在第一次被访问的时候会被实例化,而servlet一旦被实例化那么其中的init方法就会被执行,而且只会被执行一次。
(2)任何一次从客户端发送过来的请求,都会导致servlet中的service方法被执行,这个过程中在service方法的内部根据请求方式的不同调用不同的do***方法。
(3)当servlet从服务器中移除或者服务器关闭的时候servlet对象就会被销毁,里面的destroy方法就会执行,然后垃圾回收器就会将其回收。
package com.offcn.servlet;

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

@WebServlet("/LifeServlet")
//上文说过,基于HTTP协议的web项目中的Servlet直接继承HttpServlet即可
public class LifeServlet extends HttpServlet {
		@Override
		public void init() throws ServletException {
			System.out.println("初始化");
		}
		@Override
		protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
			System.out.println("服务了");
		}
		@Override
		public void destroy() {
			System.out.println("销毁了");
		}
}

1、初始化(init方法)
默认情况下,第一个请求到达时被初始化,初始化在整个生命周期中只有一次。
可以使用其值为大于或等于0的整数,设置Servlet在服务器启动时初始化。

<?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_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>Edu-10</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>LifeServlet</servlet-name>
  	<servlet-class>com.offcn.servlet.LifeServlet</servlet-class>
 <!--使用<load-on-startup>其值为大于或等于0的整数,设置Servlet在服务器启动时初始化  -->
  	<load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  	<servlet-name>LifeServlet</servlet-name>
  	<url-pattern>/life</url-pattern>
  </servlet-mapping>
</web-app>

2、提供服务(service方法)
在生命周期中,会提供n次服务
3、销毁(destroy方法)
服务器停止时自动销毁,销毁在生命周期中也只有一次。

1.6.1 Servlet的启动时加载

Servlet对象是第一次访问时被创建的,init方法就会执行。假设在init方法中做了一些比较耗时的操作(比如加载一些配置文件并且解析),那么第一个用户第一次访问这个Servlet的时候据需要等待一些时间。为了是第一个用户第一次访问时不用等待,就使用了启动时加载。通过配置文件将Servlet的实例化的过程放在服务器启动时。

方法:
	在web.xml中的<servlet>标签中进行配置,<load-on-startup>整数<load-on-startup>,
	整数越小,优先级越高(通常写22之后的数值,因为Tomcat中默认配置的是1)。
1.7 Servlet访问路径的配置
<url-pattern>配置的方式:
1)完全路径匹配
	以 / 开始      如/bbb
2)目录匹配
	以 / 开始,以 /* 结束   如/aaa/*  表示/aaa/这个目录下输入任意字符都可以访问
3)扩展名匹配
	以 * 开始     如*.action  表示以.action结尾的路径都可以访问

优先级:完全路径匹配 > 目录匹配 > 扩展名匹配

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐