手撕servlet

1.Servlet的概念及⼯作原理

1.1servlet是什么:

全称Java Servlet(server + let),是服务器内部的小程序,简言之就是一个Java程序,运行在我们web服务器上(例如:tomcat),用于接收和响应客户端的请求,更多配合动态资源去书写。
从原理上讲,Servlet可以响应任何 类型的请求,但绝⼤多数情况下Servlet只⽤来扩展基于HTTP协议的 Web服务器。

servlet三个技术核心

1)servlet技术
2)监听器
3)过滤器

2.第一个servlet程序

2.1书写servlet步骤:

step1:书写一个类,实现servlet接口
step2:重写里面的方法
step3:配置tomcat的注册(web.xml)
step4:测试(当我们运行servlet进行测试的时候,需要url路径进行测试,http://localhost:8080/项目名/)
书写一个servlet

public class HelloServlet implements Servlet{

	@Override//销毁方法
	public void destroy() {
		System.out.println("销毁方法");
	}

	@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 {
		System.out.println("初始化方法");
	}

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		System.out.println("服务方法");
	}

}

在web.xml中进行注册配置(注意:再用其他servlet则继续配置,但是name和url不能重复。)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
  <display-name>kkb3servlet</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
  <servlet>
 	 	<!-- 随便起的名字,建议与类名相同,字母变小写 -->
  		<servlet-name>helloServlet</servlet-name>
  		<!--放置书写servlet的完整类名  -->
  		<servlet-class>servlet.HelloServlet</servlet-class>
  </servlet>
  <!--servlet映射  -->
  <servlet-mapping>
  <!--servlet-name与上一个一定要一样  -->
  		<servlet-name>helloServlet</servlet-name>
  		<!--访问servlet路径设置,前面必须加/路径名  -->
  		<url-pattern>/hs</url-pattern>
  </servlet-mapping>
</web-app>

(当我们运行servlet进行测试的时候,需要url路径进行测试,http://localhost:8080/项目名/)

2.2 servlet执行过程

http://localhost:8080/servlet/hs
step1:找tomcat应用
step2:找到项目
step3:找到web.xml,“hs”在url-pattern
step4:通过“hs”找到servlet-name
step5:通过servlet-name找到对应servlet-class
step7:通过servlet-class找到对应的那个servlet类进行加载

2.2 servlet生命周期

servlet生命周期:(面试题)
从创建到销毁的过程,称为生命周期
1)初始化方法init:当servlet创建成功后,执行init方法
一个servlet只能初始化一次init方法,执行一次
默认的情况下:第一次访问servlet时,才会创建servlet实例
2)service方法:只要客户端来请求了,那么就执行这个方法,该方法会被执行多次,处理请求和响应
3)destroy销毁方法:servlet销毁的时候,就会执行该方法
3.1)当项目从tomcat中移除
3.2)正常关闭tomcat服务器

注意!!!doGet和doPost不是生命周期的方法

3.正常开发过程中,书写servlet不是去实现servlet接口,而是继承HttpServlet

step1:书写一个类,继承HttpServlet接口
step2:重写doget dopost方法(正常页面默认请求方式get请求
表单可以设置post请求)
step3:配置servlet web.xml
step4:测试
代码如下:此处使用注解,不用在web.xml再配置了
3.0默认使用注解方式配置servlet url前必须加“/”

//注解
@WebServlet(name = "helloHttpServlet", urlPatterns = { "/helloHttpServlet" })
public class HelloHttpServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

4.HttpServlet其他API

4.1servletConfihg用法

可以得到servlet标签中的配置信息

public class ServletConfigDemo extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//得到servletConfig对象   开发中使用不多
		ServletConfig servletConfig = getServletConfig();
		//获取servlet标签中配置的参数
		String name = servletConfig.getInitParameter("name");
		System.out.println(name);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

配置信息

<servlet>
  	<servlet-name>servletConfigDemo</servlet-name>
  	<servlet-class>servlet.ServletConfigDemo</servlet-class>
  	<init-param>
  		<param-name>name</param-name>
  		<param-value>张三</param-value>
  	</init-param>
  </servlet>
  <servlet-mapping>
  	<servlet-name>servletConfigDemo</servlet-name>
  	<url-pattern>/servletConfigDemo</url-pattern>
  </servlet-mapping>

在这里插入图片描述

4.2servlet url配置方式

/servletConfigDemo
当我们配置url时,前面必须写/,否则tomcat启动不成功
第一种 全路径配置方式 常用
例如/servletConfigDemo 访问 可以加目录
例如/servletConfigDemo/scd

第二种 路径匹配 对于前半段匹配 结合*通配符 匹配的是任意文字

以/开头 但是结束以*接收 例如/a/*

第三种 以扩展名匹配

没有/ 以"*“开始 ,”*.扩展名" 例如*.aa

4.3 servletcontext上下文对象

每一个web工程只有一个上下文对象,说白了就是在任何一个servlet下,都获取到这个上下文对象
1.配置全局参数
step1:在web.xml中配置全局参数(这个参数 整个项目都可以通servletcontext对象进行获取)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
 version="3.1">
  <display-name>kkb3servlet</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
  <!--配置全局参数,范围整个web工程  -->
  <context-param>
  	<param-name>sex</param-name>
  	<param-value>男</param-value>
  </context-param>
</web-app>
//获取全局参数  
//得到上下文对象
ServletContext servletContext = getServletContext();
//通过键取值
String sex = servletContext.getInitParameter("sex");
```

2.获取web资源根据工程相对路径可以获取它的绝对路径(tomcat服务器中)

		//获取全局参数  得到上下文对象
		ServletContext servletContext = getServletContext();
		//src下资源访问案例   
		//路径一定要正确 否则得到的也是错误的
		String realPath = servletContext.getRealPath("WEB-INF/classes/file.txt");
		//WebContent下资源案例
		String realPath2 = servletContext.getRealPath("index.html");
		System.out.println("绝对路径src下"+realPath);
		System.out.println("绝对路径WebContent下"+realPath2);

3.获取域对象数据
servletcontext本身就是域对象
什么是域对象?
域对象就是在web工程中帮助我们存储数据的一个对象 四个不同域对象它们区别就是存储范围。我们可以向域对象中存数据,通过域对象取数据。
step1:获取上下文对象 域对象范围整个工程

ServletContext servletContext = getServletContext();

step2:往域对象中放置数据

servletContext .setAttribute("name","张三");

step3:获取数据(如果是其他servlet中获取 第一步先要获取到上下文对象,然后取值)

String name = (String)servletContext.getAttribute("name");

servletContext对象什么时候创建什么时候销毁
服务器启动时会为web工程创建一个上下文对象
服务器启动了 或者项目移除了就销毁了

4.4 get和post区别

get表示从服务器获取数据,通常不需要向服务器传大量数据
1)显示提交 参数放在地址后以?开始
2)安全性较低,适合一些非隐私数据
3)传输数据有限制,低的浏览器长度有限制,默认网页都是get请求
post表示向服务器传输数据,当然也可以获取数据
1)隐式提交,参数放在body体中,地址栏不可见(也可放在地址栏后面)
2)安全性比get更高,适合传输隐私数据,例如账户密码
3)传输数据理论没有大小 一般企业级的开发使用post发送请求较多

4.5 request和response常用方法

request对象中的方法:
String getContextPath() 获取工程名
getSession() 获取session对象
getParameter() 根据键获取单个请求参数
request.getParameterValues() 获取请求参数多个值 是同一个键的情况下
request.setCharacterEncoding(“UTF-8”) 解决post提交乱码

public class requestDemo extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取工程名
		String path = request.getContextPath();
		System.out.println(path);
		//获取请求参数单个值
		System.out.println(request.getParameter("name"));
		//获取请求参数多个值    是同一个键的情况下
		String[] s = request.getParameterValues("hobby");
		for(String ss:s) {
			System.out.println(ss);
		}
		}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

在web.xml中进行配置

<servlet>
  	<servlet-name>requestDemo</servlet-name>
  	<servlet-class>servlet.requestDemo</servlet-class>
  </servlet>
 <servlet-mapping>
  	<servlet-name>requestDemo</servlet-name>
  	<url-pattern>/requestDemo</url-pattern>
  </servlet-mapping>

书写一个简单的页面信息

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="requestDemo" method="get">
		姓名:<input name="name"><br>
		性别:<input name="sex"><br>
		爱好:吃饭<input type="checkbox" value="吃饭" name="hobby" />
		睡觉<input type="checkbox" value="睡觉" name="hobby" />
		玩游戏<input type="checkbox" value="玩游戏" name="hobby" /><br>
		<input type="submit" value="提交" />
	</form>
</body>
</html>

response对象中的方法
getStatus(int sc) 设置响应码
response.setContentType(“text/html;charset=UTF-8”) 解决响应乱码

response.setStatus(112);
	//响应给客户端数据 页面
	response.getWriter().print("123456");
	//打印流  字符流  常用
	PrintWriter writer = response.getWriter();
	writer.print("哈哈");
	writer.close();
	//字节流
	ServletOutputStream outputStream = response.getOutputStream();

4.6请求乱码与响应乱码问题解决

get请求中文不会发生乱码问题,前提是tomcat版本必须是8以上,默认编码格式是:UTF-8
post请求参数中文会发生乱码,因为默认编码格式不是UTF-8,需要修改其格式为UTF-8,这样问题就解决了

request.setCharacterEncoding("UTF-8");

当我们使用响应对象时,数据中文会出现乱码问题,如下解决:

response.setContentType("text/html;charset=UTF-8");

4.7转发和重定向

作用就是跳转页面
转发和重定向区别:
转发是在服务器端完成的;重定向是在客户端完成的
转发速度快;重定向速度慢
转发的是同一次请求;重定向是两次不同的请求
转发地址栏没有变化;重定向地址栏有变化
转发可以携带参数;重定向不能携带参数(在request的属性)
转发的方法request对象中的方法

request.getRequestDispatcher("index.html".forward(request,response);

//重定向

response.sendRedirect("index..html");

在这里插入图片描述在这里插入图片描述

发布了14 篇原创文章 · 获赞 16 · 访问量 305

猜你喜欢

转载自blog.csdn.net/qq_41490938/article/details/104979044