Servlet

🌟Servlet 接口
当服务器接到客户端的请求后调用了Servlet, Servlet给这个请求分配对应的处理类,处理完传给服务器,服务再返回给客户端。

🚩面试常考:Servlet 生命周期
4个步骤:
1)实例化 —先创建Servlet 实例
2)初始化 —init( )
3)处理请求 —-service( ) ps:如果重写这个方法,无论do get()请求还是do post() 请求都会执行这个方法
4)服务终止 — destroy( )

🚩✅需背诵:
1)当客户端首次发送第一次请求后,由web服务器(tomcat))去解析请求,根据请求找到对应的Servlet,判断servlet对象是否存在,不存在则创建servlet 实例,调取init( )方法 进行初始化操作,初始化完成后调取service() 方法,由service()判断客户端请求方式,如果是get,则执行deGet(),如果是post 则执行do Post() 处理方法完成后,做出相应结果给客户端,单次请求处理完毕。
2)当客户发送第二次以后的请求时,会判断对象是否存在,但是不再执行sevlet创建操作和init()初始化操作,会直接执行service 方法,调取do Get() / do Post() 方法。
3)当服务器关闭之前,调取destroy()方法进行销毁。
⚠️注意:Servlet的init 方法只执行一次,说明一个Servlet 在内存中只存在一个对象,Servlet 是单例的
*多个用户同时访问可能存在线程安全问题
*解决:尽量不要在Servlet中定义成员变量,可以在每个方法中设置局部变量,即使定义了成员变量,也不要修改这个值

🌟Servlet 使用步骤:
1)创建javaEE项目
2)定义一个类,实现Servlet接口
3)实现接口中的抽象方法
4)配置Servlet:浏览器要通过一个url:localhost:80/项目名/资源路径,的资源名称找到第2)步创建的类,所以需要把java类映射成一个资源路径,需要再web.xml进行配置
1.给定义的类配置一个servlet标签,并给这个servlet 起一个名

<servlet>
<servlet-name>给这个servlet标签起的一个名:demo1</servlet-name>
<servlet-class>
    实现servlet接口的全类名
如:cn.itcast.web.servlet.ServletDemo
</servlet-class>
</servlet>

2.通过mapping 映射,指定通过哪个路径能够访问到这个类

<servlet-mapping>
    <servlet-name>demo1:这个servlet标签名对应上面类的servlet接口的标签名</servlet-name>
    <url-pattern>资源路径:/demo1,以/ 开头 </url-pattern>
</servlet-mapping>

🌟Servlet执行原理:
1)当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
2)查找web,xml文件,是否有对应的标签体内容
3)如果有,则再找到对应的全类名
4)tomcat 会将字节码文件加载进内存,并且创建其对象
5)调用其方法

🌟Servelet 接口的层级结构:五个抽象方法

public interface Servlet {
    void init(ServletConfig var1) thorws ServletException;//初始化
    ServletConfig getServletConfig();
    void service(ServletRequest var1, ServletResponse var2);//提供服务
    String getServletInfo();
    void destroy();//关闭,强制关闭不执行
}

🌟Servlet使用
1)创建一个类实现Servlet接口重写其方法,或继承HttpServlet亦可
在这里插入图片描述

2)web.xml 文档中配置映射关系
XML 中配置好这个Servlet的映射关系:

<servlet>
<servlet-name>自定义名称</servlet-name> <servlet-class>处理请求的类的完整路径</servlet-class> 
</servlet>
<servlet-mapping><!-- mapping 表示映射 --> 
<servlet-name>自定义名称</servlet-name> 
<url-pattern>请求名</url-pattern> </servlet-mapping> 

✨上述标签的执行顺序:
标签的执行顺序:
请求过来以后->web.xml->servlet-mapping标签中的url-pattern标签中的内容和请求名
进行匹配->匹配成功后找对应的servlet-mapping标签中的servlet-name-> 去servlet标签中找和上一个servlet-name相同的name值->去找servlet标签中的servlet-class中处理类的完整路径
(3) 启动tomcat,在浏览器输入http://localhost:8080/工程名/访问服务器的路径

🌟注解配置:
1.创建一个JavaEE项目,选择Servlet 的版本3.0 以上,可以不创建web.xml
2.定义一个类,实现Servlet 接口
3.复写方法
4.在类上使用@WebServlet注解,进行配置用法:
@WebServlet(“资源路径”)
🌟HTTP请求:
HTTP由请求行,请求体,请求空行,
HTTP 协议有7种亲故方式,常用的有两种:
GET:
1)请求参数在请求行中,在url后面
2)请求的url长度有限制
3)不太安全
POST:
1)请求参数在请求体中
2)请求的url长度没有限制
3)相对安全

2.请求头:客户端浏览器告诉服务器一些信息
请求头名称:请求头值

*常见的请求头:
1.User-agent: 浏览器告诉服务器,我访问你使用的浏览器版本信息
2.Referer:http://localhost/login.html
*告诉服务器,我(当前请求)从哪里来?

*作用:
1)防盗链:
2)统计工作:

3.请求空行
4.请求体:正文
*封装POST请求消息的请求参数

🌟请求和响应
✨request 获取请求行的数据
获取虚拟目录:/day14 包名
String getContextPath()
获取请求URL:/day14/demo1
String getRequestURL(): /day14/demo1
StringBuffer getRequestURL() :http://localhost/day14/demo1

✨request 获取请求体数据
请求体:只有Post请求方式才有请求体,在请求体中封装了POST请求的请求参数
步骤:(以前的用法)
1.获取流对象
*BufferedReader getReader():获取字符输入流。只能操作字符数据
*ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
*在文件上传时使用
2.再从流对象中拿数据

✨Request其他功能
1.获取请求参数通用方式:(现在的用法)
1)String getParameter(String name):根据参数名称获取参数值 username=zhangsan&password=123
2)String[] gerParameterValues(String name):根据参数名称获取参数值的数组 hobby=xx&hobby=game
3)Enumeration gerParameterNames():获取所有请求的参数名称
4)Map<String,String[]> getParameterMap():获取所有参数的map集合,穿多个hobby 键值对

2.请求转发:一种再服务器内部的资源跳转方式
✨步骤:
1)通过request 对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
2)使用RequestDisapatcher 对象来进行转发:forward(ServeletRequest request,ServletResponse response)

eg.
request.getRequestDispatcher(“/requestDemo9”).forward(request,response);
✨特点
1.浏览器地址栏路径不发生变化
2.只能转发到当前服务器内部资源中
3.转发是一次请求

3.共享数据:
*request是一个域对象,即一个有作用范围的对象,可以再范围内共享数据
*request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
*方法:
1)void setAttribute(String name,Object obj):存储数据
2)Object getAttribute(String name):通过键获取值
3)vid remiveAttribute(String name):通过键移出键值对
4.获取ServletContext

🌟用户登录的案例
1.编写login.html 页面:username & password 两个输入框
2.是你用Druid 数据库连接池技术,操作mysql,day14数据库中user表
3.使用JDBC Template 技术封装JDBC
4.登录成功跳转到SuccessService展示:登录成功!用户名,欢迎您
5.登录失败跳转带FailServlet展示:登录失败,用户名或密码错误

✨开发步骤:
1.创建项目,导入html页面,配置文件,jar包
2.创建数据库
3.创建包 cn.itcast.domain,创建类User (用户bean类)
4.创建包 cn.itcast.dao, 创建类UserDao, 提供login方法,增删改查
5.创建JDBC工具类,使用Durid连接池
6.编写cn.itcast.web.servlet.LoginServlet类,写登录的具体逻辑

🌟响应
✨功能:设置响应消息
1.设置响应行
格式:HTTP/1.1 200 ok
设置状态码:setStatus(int sc)
2.设置响应头:setHeader(String name, String value)

重定向:访问response demo1会自动跳转到response demo2资源
response.sendRedirect(“/day15/responseDemo2”);
原理就是响应状态码(302)和响应头(location,url)的设置

重定向的特点:
1)地址栏发生变化
2)重定向可以访问其他(服务器)的资源
3)重定向是两次请求,不能使用request对象来共享数据

转发的特点:
request.getRequestDispatcher(“/responseDemo2“).forward(req,resp);
1)转发地址栏路径不变
2)转发只能访问当前服务器下的资源
3)转发是一次请求,可以使用request对象来共享数据

⚠️路径写法:
路径分类:
1)相对路径:通过相对路径不可以确定唯一资源
不以 / 开头,以 . 开头的路径,如 :. /index.html
🐢规则:找到当前资源和目标资源之间的相对位置关系才可以使用
. / ——当前目录
…/ ——后退一级目录

2)绝对路径:通过绝对路径可以确定唯一资源
如:http://localhost/day15/responseDemo2 /day15/responseDemo2
以 / 开头的路径
🐢规则:判断定义的路径是给谁用的?判断请求将来从那发出
给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
建议虚拟目录动态获取:request.getContextPath( );
给服务器使用:不需要加虚拟目录

3.设置响应体:
使用步骤:
1)获取输出流(流向:客户端)
字符输出流:PrintWriter getWriter(); 返回打印流类型
字节输出流:ServletOutputStream getOutputStream();当成输出流使用

2)使用输出流,将数据输出到客户端浏览器

案例:服务器输出字符数据到浏览器
步骤:
1.获取字符输出流
2.输出数据
⚠️注意乱码问题:
PrintWriter pw = response.getWriter();获取的流的默认编码是ISO-8859-1
设置该流的默认编码
告诉浏览器响应体使用的编码
//获取流之前设置
response.setContentType(“text/html; charset=utf-8”);

🌟ServletContext 对象
1.概念:代表整个web应用,可以和程序的容器(服务器)来通信
2.获取:
1)通过request对象获取
request.getServeletContext();
2)通过HttpServlet获取
this.getServletContext();

3.功能:
1)获取MIME类型(在互联网通信过程中定义的一种文件数据类型)
格式:大类型/小类型
获取:
ServletContext context = this.getServletContext();
String filename = a.jpg; //image/jpeg
获取MIME类型
String mimeType =context.getMimeType(filename);
System.out.println(mimeType);

2)域对象:共享数据
setAttribute(String name,Object value)
getAttribute(String name);
removeAttribute(String name);

ServletContext 对象范围:所有用户所有请求的数据(谨慎使用)

3)获取文件的真实(服务器)路径
方法:String getRealPath(String path);//注意层级
Class loader 只能获取src下的文件

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值