4/14day33_Servlet
2020-04-24 本文已影响0人
蹦蹦跶跶的起床啊
回顾
1. 软件的架构有哪两种
B/S架构
C/S架构
2. WEB资源分成哪两种
静态资源:html、js、css
动态资源:java代码(servlet、jsp)
3. Tomcat项目发布的三种方式
放置到webapps目录下
修改server.xml
自定义xml文件【推荐】
4. Idea配置Tomcat,创建web项目,部署web项目
javaEE7版本
5. 浏览器开发工具查看HTTP协议请求和响应内容
6. 请求内容
请求行
get
post
请求头
请求体
7. 响应内容
响应行
200
304
404
响应头
响应体
Servlet入门
今日目标
1. 创建servlet
xml
anno(注解)
2. servlet执行原理
3. servlet生命周期
4. servlet体系结构
一 Servlet概述
- servlet= server+applet 运行在服务器端的java程序。
- Servlet是一个接口,一个类要想通过浏览器被访问到,那么这个类就必须直接或间接的实现Servlet接口
作用
接收请求,处理逻辑,响应结果
二 Servlet快速入门
目标:编写一个普通的java类,通过浏览器可以访问
2.1 代码编写
① 创建web项目
② 编写普通java类,实现servlet接口
冲写抽象方法(service方法)
public class QuickServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
// 对外提供服务
/*
request:代表请求
response:代表响应
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
// 向浏览器响应一句话
servletResponse.getWriter().write("QuickServlet");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
③ 配置web.xml
配置servlet网络访问路径
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!--
把QuickServlet交给tomcat管理
servlet-name:当前servlet的别名(使用类名即可)
servlet-class:全限定类名
-->
<servlet>
<servlet-name>QuickServlet</servlet-name>
<servlet-class>cn.itcast.a_quick.QuickServlet</servlet-class>
</servlet>
<!--
给servlet设置一个网络的访问地址(路径)
servlet-name:给指定别名的servlet配置映射
url-pattern:网络访问地址(注意:必须以/开头)
-->
<servlet-mapping>
<servlet-name>QuickServlet</servlet-name>
<url-pattern>/quickServlet</url-pattern>
</servlet-mapping>
</web-app>
④ 部署web项目
⑤ 启动测试
2.2 执行原理【课下作业】
三 Servlet相关API
3.1 生命周期相关
3.1.1 思想介绍
- 生命周期:指的是一个对象从生(创建)到死(销毁)的一个过程
// 1. servlet对象创建时,调用此方法
public void init(ServletConfig servletConfig);
// 2. 用户访问servlet时,调用此方法
public void service(ServletRequest servletRequest, ServletResponse servletResponse);
// 3. servlet对象销毁时,调用此方法
public void destroy();
* 创建
1)默认情况下
用户第一次访问时,创建servlet,执行init方法
2)修改创建时机
<load-on-startup></load-onstartup>
正数:4-N 【服务器启动时,创建】
补充:Tomcat的web.xml里有1,3 所以推荐4-n
负数(默认值):-1 【用户第一次访问时,创建】
* 运行(提供服务)
用户每次访问时,都执行service方法
* 销毁
服务器正常关闭时,销毁servlet,执行destroy方法
3.1.2 代码演示
① LifeServlet
public class LifeServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("LifeServlet创建了....");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("LifeServlet的service方法执行了");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("LifeServlet销毁了...");
}
}
② 配置web.xml
<!--servlet的生命周期-->
<servlet>
<servlet-name>LifeServlet</servlet-name>
<servlet-class>cn.itcast.b_api.LifeServlet</servlet-class>
<!--tomcat启动时,创建servlet对象,执行init方法 -->
<load-on-startup>4</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>LifeServlet</servlet-name>
<url-pattern>/lifeServlet</url-pattern>
</servlet-mapping>
3.2 拓展:ServletConfig
Tomcat在Servlet对象创建时,执行init()方法,并创建一个ServletConfig 配置对象
- 主要作用:读取web.xml配置文件Servlet中<init-param>信息,实现参数和代码的解耦
① EncodeServlet
public class EncodeServlet implements Servlet {
// 定义全局变量
private ServletConfig servletConfig;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
this.servletConfig = servletConfig;
}
@Override
public ServletConfig getServletConfig() {
return servletConfig;
}
// 用户访问,执行service方法
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
// String encode = "GBK";
// 读取配置文件的 init-param 参数
String encode = getServletConfig().getInitParameter("encode");
servletResponse.getWriter().write(encode); // 输出到浏览器
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
② 配置web.xml
<!--servlet的配置对象-->
<servlet>
<servlet-name>EncodeServlet</servlet-name>
<servlet-class>cn.itcast.b_api.EncodeServlet</servlet-class>
<init-param>
<param-name>encode</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>EncodeServlet</servlet-name>
<url-pattern>/encodeServlet</url-pattern>
</servlet-mapping>
四 Servlet体系结构
4.1 GenericServlet
① 编写普通java类,继承GenericServlet抽象类
public class ServletDemo1 extends GenericServlet {
@Override
public void init() throws ServletException {
System.out.println("ServletDemo1 创建了...");
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
super.getServletConfig(); // 调用父类的配置对象
servletResponse.getWriter().write("ServletDemo1 extends GenericServlet");
}
@Override
public void destroy() {
System.out.println("ServletDemo1 销毁了..");
}
}
② 配置web.xml
<!--servlet继承genericServlet-->
<servlet>
<servlet-name>ServletDemo1</servlet-name>
<servlet-class>cn.itcast.c_inherit.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo1</servlet-name>
<url-pattern>/servletDemo1</url-pattern>
</servlet-mapping>
4.2 HttpServlet
① 编写前端html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<h3>用户登录</h3>
<form action="http://localhost:8080/day08_servlet_xml/servletDemo2" method="get">
<input type="submit" value="提交表单..">
</form>
</body>
</html>
② 编写普通java类,继承HttpServlet抽象类
public class ServletDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("get....");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("post...");
}
}
③ 配置web.xml
<!--servlet继承httpServlet-->
<servlet>
<servlet-name>ServletDemo2</servlet-name>
<servlet-class>cn.itcast.c_inherit.ServletDemo2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo2</servlet-name>
<url-pattern>/servletDemo2</url-pattern>
</servlet-mapping>
4.3 经验值分享
① 响应状态码405
请求方法没有重写.....
② 响应状态码500
java代码写错了...
五 Servlet路径
5.1 url-pattern
作用:将一个请求网络地址和servlet类建立一个映射关系
5.1.1 Servlet映射多个url
5.1.2 url映射模式【了解】
配置 <url-pattern> url地址取值可以是:
1. 精确匹配(掌握)
/servletDemo3
2. 目录匹配
/aa/*
3. 后缀匹配
*.xxx 例如:*.do
<!--
只要浏览器符合目录匹配规则,都可以访问到这个servlet:
/aa/abc
/aa/asadfasdf
-->
<servlet>
<servlet-name>ServletDemo4</servlet-name>
<servlet-class>cn.itcast.d_url_pattern.ServletDemo4</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo4</servlet-name>
<url-pattern>/aa/*</url-pattern>
</servlet-mapping>
<!--
只要浏览器符合后缀匹配规则,都可以访问到这个servlet
aa.do
bb.do
xx.do
-->
<servlet>
<servlet-name>ServletDemo5</servlet-name>
<servlet-class>cn.itcast.d_url_pattern.ServletDemo5</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo5</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
5.2 相对/绝对路径
- 现阶段我们访问资源的方式越来越多,请求路径在编写时难免出现混淆
-
浏览器的地址栏
-
a标签的href属性
-
form表单的action属性
-
js的loation.href属性
-
ajax请求地址
这里我们复习下路径规则:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>path</title>
</head>
<body>
<h3>测试访问路径:http://localhost:8080/day08_servlet_xml/static/path.html</h3>
<h4>绝对路径</h4>
<!--
在开发时,强烈建议使用绝对路径
完整:协议://域名:端口/项目名/资源名
推荐:/项目名/资源名
-->
<a href="http://localhost:8080/day08_servlet_xml/quickServlet">带http协议的绝对路径:quickServlet</a> <br>
<a href="/day08_servlet_xml/quickServlet">不带http协议的绝对路径:quickServlet</a>
<h4>相对路径路径</h4>
<!--
相对路径语法:
./ 当前目录 注:./可以省略不写
../ 上级目录
-->
<a href="../quickServlet">相对路径:quickServlet</a>
</body>
</html>
六 Servlet3.0
- 通过注解配置Servlet,简化web.xml配置Servlet复杂性,提高开发效率,几乎所有的框架都在使用注解
① 创建web工程【注解】
② 编写普通java类,继承HttpServlet
public class QuickServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("QuickServlet....3.0");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("QuickServlet....3.0");
}
}
③ 配置@WebServlet
// @WebServlet(name = "QuickServlet",urlPatterns = "/quickServlet")
// @WebServlet(urlPatterns = "/quickServlet")
// @WebServlet(value = "/quickServlet")
@WebServlet("/quickServlet") // 注解中有且仅有一个属性,名为value时,属性名可以省略...
public class QuickServlet extends HttpServlet {
}