目录
一、Servlet
Servlet的概述
Servlet的三种使用方式
Servlet的生命周期
二、Servlet中的其他对象
ServletConfig 对象(没什么大用,了解即可)
ServletContext最大域对象(Application域)
ServletRequest对象: 请求对象(该对象后面文章会详细讲述)
ServletResponse对象: 响应对象(该对象后面文章会详细讲述)
三、Servlet 细节
注解servlet
Servlet是否线程安全?
Servlet的url-pattern的使用
四、idea 与tomcat(idea会自动部署javaweb项目)
一、Servlet
解析:
1、Servlet是JavaWeb的三大组件之一,它属于动态资源。
2、Servlet的主要作用是处理请求,服务器会把接收到的请求交给Servlet来处理;
3、在Servlet中通常需要:
3.1、接收请求数据;
3.2、处理请求;
3.3、完成响应;
tips1:例如客户端发出的登录请求、注册请求、查询请求等,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来编写,每个Servlet必须实现Javax.servlet.Servlet接口。
tips2:JavaWeb中的三个剑客(组件):
Servlet:接收用户请求,处理请求,响应结果
Filter:(过滤器)拦截请求
Lisenter:(监听器)监听某一行为,只有用户触发这一行为,自动执行指定代码
一、让一个普通类变成Servlet的三种方式
1、实现javax.servlet.Servlet接口(便于理解Servlet的生命周期)
2、继承javax.servlet.GenericServlet抽象类
GenericServlet 实现Servlet接口, 把Servlet接口其他四个方法实现, service() 变成抽象方法
3、继承javax.servlet.http.HttpServlet抽象类 (实际开发中使用这种方式)
实际开发: 继承HttpServlet, 重写doGet()或者doPost()
二、在WEB-INF/web.xml文件中进行配置(在后期我们会使用注解的方式)
AServlet:
package com.fs.web.Servlet;
import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;
/**
* 取Servlet的类名: XxxServlet
* 实现Servlet的第一种方式
* 实现javax.servlet.Servlet接口
*/
public class AServlet implements Servlet {
private ServletConfig servletConfig; //默认null
/**
* 初始化方法 生命周期方法, 由Tomcat调用 做初始化操作
* 在Servlet创建之后调用, 调用一次
* @param servletConfig
* @throws ServletException
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("555~~555,我出生了...");
this.servletConfig = servletConfig;
}
/**
* 得到ServletConfig对象 (Servlet的配置)
*
* @return
*/
@Override
public ServletConfig getServletConfig() {
return servletConfig;
}
/**
* 最重要的方法, 接收用户请求,处理用户请求, 响应结果
* Tomcat调用: 生命周期方法 , 每请求一次,执行一次
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("AServlet 正在服务...");
//获取Servlet配置
//System.out.println("Servlet的名字:"+servletConfig.getServletName());
//获取初始化参数
//根据初始化参数名获取值
String name = servletConfig.getInitParameter("name");
System.out.println("name:"+name);
//获取所有的初始化参数名
Enumeration<String> names = servletConfig.getInitParameterNames();
//遍历
while(names.hasMoreElements()){
String key = names.nextElement(); //参数名
String value = servletConfig.getInitParameter(key);
System.out.println("key:"+key+"--value:"+value);
}
}
/**
* 没什么意义
* 得到Servlet的描述
* @return
*/
@Override
public String getServletInfo() {
return null;
}
/**
* 销毁方法, 释放资源
* 生命周期方法, Tomcat调用,
* 在Servlet销毁之前调用, 只执行一次
*/
@Override
public void destroy() {
System.out.println("555~555~我走了...");
}
}
we.xml中的配置 :
<!--配置Servlet, 一个Servlet类绑定一个url(客户端访问入口)-->
<servlet>
<!-- 名称 随意取, 一般取名类名-->
<servlet-name>AServlet</servlet-name>
<!--对应的Servlet类, 全限定名(包.类名) -->
<servlet-class>com.fs.web.Servlet.AServlet</servlet-class>
<!--配置初始化参数-->
<init-param>
<param-name>name</param-name>
<param-value>张三</param-value>
</init-param>
<init-param>
<param-name>age</param-name>
<param-value>21</param-value>
</init-param>
</servlet>
<servlet-mapping>
<!--名称, 与对应servlet的servlet-name一样 -->
<servlet-name>AServlet</servlet-name>
<!--绑定url: /路径 一般取名: /类名 -->
<url-pattern>/AServlet</url-pattern>
</servlet-mapping>
运行结果:出现以下说明运行成功
控制台打印:
解析:
描述Servelet的一生, 从生到死过程
1. 默认情况: Servlet第一次请求的时候,由Tomcat创建
2. 调用init()方法
3. 用户每请求一次这个Servlet, tomcat调用一次service()方法
4. 当Tomcat服务器关闭之前, 销毁它创建的所有对象,包含创建Servlet, 在Servlet销毁之前, 调用destroy()
二、Servlet中的其他对象
-
ServletConfig 对象(没什么大用,了解即可)
解析:
1. 获取Servlet的初始化参数 参数名,参数值 都是String类型
String getInitParameter(String name): 根据初始化参数名获取初始化参数值
Enumeration<String> getInitParameterNames(): 获取所有的初始化参数name
-
ServletContext最大域对象(Application域)
解析:
1、该对象全项目共用(敏感数据勿存)
2、获取方法如下:
使用ServletContext存放数据
1.获取ServletContext对象,
第一种方式: ServletConfig的getServletContext()
ServletContext servletContext = this.getServletConfig().getServletContext();
GenericServlet 实现了ServletConfig接口, 直接调用getServletContext()
ServletContext application = this.getServletContext();
2.存数据
application.setAttribute("name","老王");
-
ServletRequest对象: 请求对象(该对象后面文章会详细讲述)
解析:
1、 核心方法: 获取请求参数
String getParameter(String name): 根据请求参数name获取请求参数值
2、 前端发送请求有哪些方式:
1. form 的action 可以是get,post method: 默认值get, 设置post,发送post请求
2. 超链接`<a href="">` 只能get
3. 直接在浏览器地址栏输入url 只能get
4. js发送ajax请求 可以是get,post
请求方式: GET请求/POST请求
get请求: 请求参数通过url传递, 请求参数 url: url?k1=v1&k2=v2&...
不安全, 传递字符串, 不能传递文件数据
post请求: 请求参数通过请求体传递,
安全性高, 传递字符串, 传递文件数据
-
ServletResponse对象: 响应对象(该对象后面文章会详细讲述)
解析:
1、getWriter() 得到字符响应输出流, 服务器通过改输出流,把数据写到客户端的浏览器页面上
2、System.out.println(): 把数据打印到服务器的控制台
三、Servlet 细节
解析:
1、注解: 特殊的接口, 在方法,类,属性.... @注解名 (创建注解类的对象)
Servlet中的注解是用来替换web.xml中的配置文件的
2、类类型: class interface enum @interface
具体如下:
@WebServlet注解 替换servlet的配置文件
// name 忽略:
//@WebServlet(name="DServlet",urlPatterns="/DServlet")
//@WebServlet(urlPatterns="/DServlet")
//urlPatterns 与value 等同
//@WebServlet(value="/DServlet")
// 如果只给value赋值, 省略 value=
@WebServlet("/DServlet")
解析:
判断依据: 多个线程是否共享同一资源, 是共享, 线程不安全, 不是共享, 线程安全(这是所有是否线程安全的判断依据)
因此:在AServlet类在Tomcat只有一个对象, 多个请求,请求的同一个Servlet对象, 多个线程使用的同一个对象, Servlet对象共享, 线程不安全
tips:一定不要再Servlet提供存放数据的属性(也就是在Servlet中提供全局变量)
解析:
1. 一个Servlet只能绑定一个Url?
可以绑定多个url, 但是实际开发一般只绑定一个
2. url-pattern的写法
/字符串 绑定确定的url
结合 * (通配符, 任意)
/user/*: 前缀匹配, 只要前面是/user开头,后面的任意 /user/a /user/b
*.后缀名: 后缀匹配, 只要url后面以 后缀名结尾的都匹配 *.do a.do c.do
特别注意: /*.后缀名 错误写法
/* 匹配所有
tips:url的匹配, 越精确,优先级越高, 没有*的url优先级高于有*的
解析:
1、第一次请求该Servlet才创建, 也称第一次惩罚, 第一次请求耗费时间多一点
2、可修改Servlet的创建时间:
修改Servlet的创建时机: 在web服务器启动的时候,创建Servlet
web.xml中配置:
<servlet>
<!--设置tomcat启动的时候,创建-->
<load-on-startup>非负整数</load-on-startup>
</servlet>
tips:load-on-startup中的数字越小,越先创建
注解方式:
@WebServlet(value="/*",loadOnStartup=2)
四、idea 与tomcat(idea会自动部署javaweb项目)
解析:
1、IDEA会为每一个tomcat部署的项目单独创建一份配置文件的地址如下图:
2、idea发布项目, 使用之前讲第三种发布方式(不知道的小伙伴去翻前面的博客吧)
3、out目录下项目 tomcat发布项目(如图)
4、其中idea的项目: 才是真正的工作项目