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");