JavaWeb之Servlet(Server Applet)基础学习与总结

笔记大纲
  • Servlet作用
  • Servlet简介
  • 创建Servlet步骤(实现Servlet接口)
  • Servlet工作原理
  • Servlet生命周期【单例多线程】
  • ServletConfig与ServletContext
  • 最终创建Servlet的方式(继承HttpServlet类)
  • 比对(请求)request与(响应)response

1.Servlet作用

  用来处理请求与响应,Tomcat只能处理静态资源,Servlet可以处理动态资源,其实就是一个接口(java类),也可以看成一个容器;
  因为客户端(html/jsp)无法直接访问java文件。我们需要客户端请求java文件。所以需要特殊的java文件即Servlet。

2.Servlet简介

  (1)Servlet:即是Server Applet(服务器端小程序)

  (2)狭义&广义

    ①狭义:javax.servlet.Servlet接口及其子接口

    ②广义:指实现了Servlet接口的实现类。

  (3) 特点

​     ①可以被页面直接请求即URL特性。

​     ②全类名。

附加(STS创建动态工程):

  第一步:右键“New”,选择Web下的Dynamic Web Project。
在这里插入图片描述
  第二步:自定义工程名,目前选择version2.5,注解就是3.0,点击Finsh即可。
在这里插入图片描述

3.创建Servlet步骤(实现Servlet接口)

(1)声明Class类实现javax.servlet.Servlet接口( 实现接口中的抽象方法)。

package com.codinglin.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 HelloServlet implements Servlet{
	@Override
	public void destroy() {
		
	}
	@Override
	public ServletConfig getServletConfig() {
		return null;
	}

	@Override
	public String getServletInfo() {

		return null;
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		
	}
	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
	
	}
}

​ (2)在web.xml中注册

​   ①全类名(让Servlet容器、JSP容器、Web容器、Web服务器创建Servlet对象)。Servlet是单例
​    ②URL特性(页面可以直接访问、浏览器也可以直接访问)。

4.Servlet工作原理

(1)测试类:HelloServlet 实现了Servlet接口

(1)请求:<a href="HelloServlet">HelloServlet</a>

(2)匹配(HelloServlet)的Url在web.xml--- <url-pattern>/HelloServlet</url-pattern>

(3)通过url查找指定<servlet-name>HelloServlet</servlet-name>

(4)通过servlet-name查询指定的Servlet:
<servlet-class>com.coding0110lin.servlet.HelloServlet</servlet-class>

(5)执行HelloServlet中service()方法,处理请求并做出响应。

URL
(2)正常的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">
  <!-- 注册HelloServlet -->
  <servlet>
    <!-- Servlet别名 -->
  	<servlet-name>HelloServlet</servlet-name>
  	<!-- 全类名-->
  	<servlet-class> com.codinglin.servlet.HelloServlet</servlet-class>
  
 
  </servlet>
  <servlet-mapping>
  	<servlet-name>HelloServlet</servlet-name>
  	<!-- URL特性 ,统一资源-->
  	<url-pattern>/HelloServlet</url-pattern>

  </servlet-mapping>

</web-app>
5.Servlet生命周期

Servlet从被创建到销毁(消亡)的过程,称之为Servlet生命周期。

执行时机执行次数
构造器第一次接收请求时执行在整个生命周期中执行一次
init()第一次接收请求时执行(在构造器之后执行)在整个生命周期中执行一次
service()每次接收请求时执行在整个生命周期中执行多次
destroy()关闭服务器时执行 ,释放资源在整个生命周期中执行一次

  【必须掌握!】通俗的说:第一次请求Servlet时,服务器(Web服务器、Servlet容器)创建Servlet对象,之后会调用init()方法进行初始化操作(为形参赋值操作),最后调用service()方法处理请求并做出响应。以后再次请求时,只会调用service()方法处理请求(不会调用构造器&init())。处理完所请求后,关闭服务器时,调用destroy()方法销毁Servlet。

6.ServletConfig与ServletContext
6.1.ServletConfig代表了Servlet的配置信息

  主要作用:

  ①获取当前Servlet名称 :getServletName()

  ②获取当前Servlet初始化参数:getInitParameter(“参数名”)

    说明:初始化参数需要配置到web.xml的servlet标签中

  ③获取ServletContext对象:getServletContext()

6.1.ServletContext代表了Servlet上下文(当前web应用,别名:application)

  主要作用:

  ①获取当前上下文的初始化参数getInitParameter(“参数名”)

  ②获取真实路径(D:test\test2…)getRealPath("/xxx.html")

  ③域对象(四个)

【附】Servlet相关接口

  ①ServletConfig:用来封装Servlet标签中的信息。

  ②ServletContext:封装了当前web工程的信息,一个web应用有且仅有一个ServletContext对象,是最大的域对象。

  ③ServletRequest:

  ④ServletResponse;

  ⑤HttpServletRequest:用来封装浏览器发给服务器的请求报文。

  ⑥HttpServletResponse;用来封装服务器发给浏览器的响应报文。

(3)web.xml配置信息(1)(2)

<?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">
    
  <!--⑵ServletContext初始化参数-->
  <context-param>
  	<param-name>age</param-name>
  	<param-value>20</param-value>
  </context-param>
  
    <!--注册DemoServlet-->
  <servlet>
  	<servlet-name>DemoServlet</servlet-name>
  	<servlet-class>com.atguigu.servlet.DemoServlet</servlet-class>
       <!--⑴ServletConfig初始化参数-->
  	<init-param>
  		<param-name>age</param-name>
  		<param-value>18</param-value>
  	</init-param>
  </servlet>
  <servlet-mapping>
  	<servlet-name>DemoServlet</servlet-name>
      <!--URL特性 ,统一资源-->
  	<url-pattern>/DemoServlet</url-pattern>
      <!--"/"代表了WebContent目录-->
  </servlet-mapping>
  
</web-app>

如果只需要留下Service()方法,之前创建Servlet就显得很累赘。

7.最终创建Servlet的方式(继承HttpServlet类)

EndServlet 继承HttpServlet 继承 GenericServlet :实现Servlet

7.1.GenericServlet类

  ①getServletConfig()

  ②getServletContext()

  ③abstract service()

7.2.HttpServlet类底层源码

HttpServlet继承GenericServlet类,抽象方法必须要重写!

//重写
override service(ServletRequest req,ServletResponse res){
 			HttpServletRequest request = (HttpServletRequest)req;
 			HttpServletResponse response = (HttpServletResponse)res;
 			service(request,response);
 	  } 
//重载
overload service(HttpServletRequest request,HttpServletResponse response){
//获取请求方式
 			String method = request.getMethod();
 			if(method.eq("GET")){
 				doGet();
 			}else if(method.eq("POST")){
 				doPost();
 			}
 	  }
7.3.代码示例(创建)

①新建servlet文件类型TestServlet(其实就是java文件),自动就会继承HttpServlet类,配置文件web.xml也会自动加载!

package com.codinglin.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 TestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
 
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("TestServlet-->doGet()");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("TestServlet-->doPost()");
	}
}

②index.html页面:

body>
<h2>index.html</h2>

<h3>Get请求</h3>
<form action="TestServlet" method="get">
	用户名:<input type="text" id="username" name="username" ><br>
	密码:<input id="pwd" type="password" name="pwd" ><br>
	<input type="reset">
	<input id="btnSub" type="submit" value="登录">
</form>
<h3>Post请求</h3>
<form action="TestServlet" method="post">
	用户名:<input type="text" id="username" name="username" ><br>
	密码:<input id="pwd" type="password" name="pwd" ><br>
	<input type="reset">
	<input id="btnSub" type="submit" value="登录">
</form>
</body>

③sts窗口输出结果

  当form中的method为“get”时,控制台输出“TestServlet–>doGet()”

  当form中的method为“post”时,控制台输出“TestServlet–>doPost()”

8.(请求)request与(响应)response
8.1.request

  (1)类型:HttpServletRequest。

  (2)定义:相当于客户端向服务器发送的请求报文,该对象由服务器创建,并以参数的形式传递给doGet()或doGet()。

  (3)作用:

序号作用方法
1获取请求参数 (通过表单名)request.getParameter() /request.getParameterValues():获取多个同名表单提交
2获取项目的虚拟路径(项目的虚拟路径为:"/项目名")request.getContextPath()
3转发(跳转路径)request.getRequestDispatcher().forword(request,response)
4域对象(四个)
5获取请求报文中请求头中的信息request.getHeader()
6获取请求协议request.getServerPort();获取请求服务器端口号 request.getScheme():获取请求协议
request.getServerName();获取请求服务器名称
8.2.response

  (1)类型:HttpServletResponse。

  (2)定义:相当于服务器向客户端发送的响应报文,该对象由服务器创建,并以参数的形式传递给doGet()或doGet()。

  (3)作用:

序号作用方法
1响应数据(数据:文本|html)response.getWriter().write();
2重定向(跳转路径)response.sendRedirect()

  说明:WEB-INF是web应用的私密目录,只有服务器访问,客户端不能直接访问。
在这里插入图片描述


 ☝上述分享来源个人总结,如果分享对您有帮忙,希望您积极转载;如果您有不同的见解,希望您积极留言,让我们一起探讨,您的鼓励将是我前进道路上一份助力,非常感谢!我会不定时更新相关技术动态,同时我也会不断完善自己,提升技术,希望与君同成长同进步!

☞本人博客:https://coding0110lin.blog.csdn.net/  欢迎转载,一起技术交流吧!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值