学习目标:
掌握Servlet学习内容:
1、 web服务器 2、 Tomcat 3、 Servlet 4、 HTTP请求 5、 两种HTTP请求方式 6、 HTTP响应 7、 ServletContext 8、 session 9、 过滤器 10、 监听器学习时间:
1、 2021年9月20日 2、 2021年9月22日 3、 2021年9月24日 4、 2021年9月26日 5、 2021年10月3日学习产出:
1、 技术笔记 1 遍 2、 宿舍管理项目web开发概述
学习web开发,需要先安装一台web服务器,将开发好的web项目部署在web服务器中供外界访问
web服务器
web服务器是指驻留于因特网上某种类型计算机的程序
可以向浏览器等web客户端提供文档,也可以放置网站文件,它是一个容器,是一个连接用户与程序之间的中间件。
WEB服务器有很多,流行的WEB服务器有Tomcat 、 WebSphere 、
WebLogic、Jboss等。
流程
浏览器访问服务器,服务器接收请求(提交表单),给web程序作出响应
通过web程序与数据库进行交互,然后再由服务器响应最后结果
服务器起到一个中间件的作用
服务器搭建 tomcat
1.官网下载 ,解压
2.配置JAVA_HOME环境变量 D:\ProgramFiles\Java\jdk1.8.0_261
TOMCAT根据java_home去查找jdk安装位置
3.在tomcat的bin目录 双击运行 startup.bat命令 启动tomcat
bin 放着各种命令 startup.bat命令 shutdown.bat
conf 放着配置文件 列如server.xml 修改端口号
lib tomcat运行所需要的jar包
logs 运行产生的日志文件
temp 临时缓存文件
webapps 部署web程序的目录
work 工作目录
4.访问 IP+端口
Tomcat目录
创建发布web项目
在idea中创建一个基本的java项目
右键 add webframework 变为web项目
项目
src java代码
web 配置文件 网页代码
部署项目
1.手动部署 自己把项目中的代码粘贴到服务器中, 平时开发不用
2.自动部署 在idea中集成tomcat
web项目结构
Servlet
Servlet概述
Server Applet的简称 用Java编写的服务器端的程序
它运行在web服务器中,web服务器负责Servlet和客户的通信以及调 用Servlet方法,Servlet和客户通信采用“请求/响应”的模式
Servlet的作用:
1.接收用户发送的请求
2.调用其他的java程序来处理请求
3.根据处理结果,服务器将响应返回给客户端
Servlet的创建和使用
1.创建一个类继承javax.servlet.http包下的HttpServlet
2.在web.xml文件中配置Servlet
3.运行Servlet程序
由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用< servlet>元素和<servlet-mapping>元素完成。
Servlet创建和使用-Servlet配置
< servlet>元素用于注册Servlet,它包含有两个主要的子元素: <servlet-name>和<servlet-class>,分别用于设置Servlet的注册名称和 Servlet的完整类名。
< servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路 径,它包含有两个子元素:<servlet-name>和<url-pattern>,分别用于指定Servlet的注册名称和Servlet的对外访问路径。
url-pattern配置模式:”/”代表当前web应用的根目录
<!--
xml 属于标记语言 html是标记内容指导内容如何显示
xml可扩展标记语言 用来保存数据 保存配置文件数据
web.xml 须放在web应用 目录WEB-INF目录下 是web程序的配置文件,保存各种配置信息,在服务器启动时,由服务器读取
-->
<!--配置servlet 把servlet配置进来,服务器就知道有这么一个类 -->
<servlet>
<servlet-name>demo</servlet-name><!--为servlet对象定义一个名称-->
<!--配置类的地址 ,让服务器使用反射机制创建对象 -->
<servlet-class>com.ffyc.firstweb.servlet.DemoServlet</servlet-class>
<!--配置的参数-->
<init-param>
<param-name>name</param-name>
<param-value>jim</param-value>
</init-param>
<!--配置servlet何时被加载创建 默认是第一次访问, 值>=0服务器启动就可以创建-->
<load-on-startup>0</load-on-startup>
</servlet>
<!--为servlet配置一个供前端访问的映射地址-->
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>/demourl</url-pattern><!--地址以/开头 /表示项目的根目录 http://localhost:8888/firstweb-->
</servlet-mapping>
Servlet 生命周期
public class DemoServlet extends HttpServlet {
/*
构造方法 初始化对象
只被执行了一次,只创建了一个对象, 此对象由服务器创建的,
默认是在客户端第一次访问该servlet时创建 servlet对象
当 <load-on-startup>0</load-on-startup> 值>=0 时,会在服务器启动时创建
*/
public DemoServlet(){
System.out.println("DemoServlet");
}
/*
初始化,当servlet对象创建后,服务器会自动调用init(),
完成一些初始化操作.
如果我们没有需要初始化的操作,也可以不重写init(),但是服务器依然会调用,会调用父类的init()
*/
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init");
System.out.println(config.getInitParameter("name"));//获得配置文件中的信息
System.out.println( config.getServletName());
}
/*
为请求提供服务,每一次http请求,都会调用service(请求,响应)
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("service");
}
/*
当servlet对象销毁时,服务器会调用destroy(),
让我完成一些最终的操作(例如保存日志....)
如果我们没有一些最终的操作,也可以不重写destroy(),但是服务器依然会调用父类中destroy()
*/
/*@Override
public void destroy() {
System.out.println("destroy");
}*/
}
HTTP协议
超文本传输协议(HyperText Transfer Protocol)服务器传输超文本到本地浏览器的传送协议,是互联网上应用最为流行的一种网络协议,用于定义客户端浏览器和服务器之间交换数据的过程
基于TCP/IP通信协议传递数据
HTTP是一个属于应用层的协议,由于其简捷、快速的方式,适用于分布 式超媒体信息系统
客户端向服务器发送请求,服务器给客户端一个响应
HTTP请求
客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求
请求包括请求行,请求头,请求体
请求行
包含HTTP请求方式,请求资源名称,HTTP版本(例如post test.jsp HTTP/1.1)
请求头
包含主机地址,以及客户端的一些环境信息,以键值对的形式传递
Host: 127.0.0.1:8088 请求的主机地址
**Accept:**text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8 浏览器能够处理的内容类型
Accept-Encoding: gzip, deflate, br 浏览器能够处理的压缩编码
Accept-Language: zh-CN,zh;q=0.9 浏览器当前设置的语言
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36 使用的浏览器和操作平台信息
Connection: keep-alive 浏览器与服务器之间连接的类型
请求体
请求体代表着浏览器在post请求方式中传递给服务器的参数,请求体以键值的形式传递
多个用&链接,服务器接收到后再进行解析
例:username=admin&userpwd=123
两种HTTP请求方式
GET方式
超链接访问,默认是GET方式
form提交,不指定method,默认为GET方式
POST方式
form提交,指定method=“POST”
区别
GET方式主要是从服务器中获取信息;POST主要是想服务器提交信息
GET方式在通过URL提交数据,数据在URL中可以看到(不安全);POST方式,数据放置在请求体中提交(安全)。
GET方式提交的数据大小受限制一般在1kb(不同浏览器也会有不同);而POST则没有此限制
HttpServletRequest
HttpServletRequest是ServletRequest的子接口
HttpServletRequest比ServletRequest多了一些针对于Http协议的方法。
请求和响应是Web交互最基本的模式,在Servlet中,用HTTPServletRequest来表示请求。
HTTPServletRequest:封装了请求信息,可以从中获取任何请求信息
获取客户机/服务器信息
getMethod()得到客户机请求方式
getScheme()请求协议
getRemoteAddr()返回发出请求的客户机的IP地址
getServerName()服务器名(ip或域名)
getServerPort()服务器端口
//请求行数据
System.out.println(req.getMethod());
System.out.println(req.getProtocol());
System.out.println(req.getServerName());
System.out.println(req.getServerPort());
//请求头
System.out.println(req.getRemoteAddr());//获得客户端的ip
System.out.println(req.getRemotePort());//客户端端口
System.out.println(req.getHeader("User-Agent"));
//接收用户请求的数据 tomcat8.0以后get请求数据的解码方式支持中文
String name = req.getParameter("name");
request获取请求参数
getParameter(name) — String 通过name获得值
getParameterValues — String[ ] 通过name获得多值
理中文乱码
post
setCharacterEncoding(编码格式)
req.setCharacterEncoding("utf-8");//设置post请求数据解码格式
System.out.println(req.getParameter("account"));
System.out.println(req.getParameter("passoword"));
System.out.println(req.getParameter("sex"));
String[] courses = req.getParameterValues("course");//获取复选框中的内容,返回的是一个数组
System.out.println(Arrays.toString(courses));
HTTP响应
一个HTTP响应代表服务器向客户端回送的数据,它包括:响应行,响应头,响应体。
响应行
包含了HTTP协议版本,以及用于描述服务器对请求的处理结果
HTTP/1.1(协议版本) 200(状态码) OK(状态码描述)
状态码:服务器和浏览器用于确定状态的固定数字号码
200:请求成功
302:请求重定向
400:语义有误,当前请求无法被服务器理解或请求参数有误
404:请求资源不存在,通常是路径写错了或者服务器资源删除了
500:服务器内部错误(代码异常)
响应头
响应头用于描述服务器的基本信息,以及数据描述
Server Apache-Coyote/1.1
Content-Type text /html;char set=UTF-8
Content-Length 0
Date Wed, 13 Sep 2017 02:26:07 GMT
响应体
代表服务器向客户端浏览器回送的正文
HttpServletReponse
HttpServletResponse是ServletResponse的子接口 。
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个代表响应的HTTPServletResponse对象
HTTPServletResponse对象代表响应
向浏览器动态生成网页内容
用getWriter()获得一个PrintWriter字符输出流输出数据
response会默认以ISO8859-1将需要输出到浏览器的字符进行解码(如果不存在会乱码)
response.setContetnType(“text/html;charset=utf-8”);方法可以同时设定response所使用的字符集编码和浏览器打开所用的字符集编码
PrintWriter out = null;
try {
resp.setContentType("text/html;charset=utf-8");//设置响应内容的编码格式
out = resp.getWriter();
out.println("<h1>登录成功</h1>");
}catch (Exception e){
out.println("<h1>服务器忙,请稍后再试!</h1>");
}
ServletContext
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的 ServletContext对象
由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此 Servlet对象之间可以通过ServletContext对象来实现数据交互,存储一些全局信息
常用方法:
getInitParameter(“name”)获得当前应用的初始化参数
setAttribute(“attrname”,value) 设置Ser vletContext属性并赋值
getAttribute(“attrname”) 获得Ser vletContext属性指定值
removeAttribute(“attrname”) 删除Ser vletContext指定属性
getRealPath(filename)获得文件的绝对路径
getContextPath()获得当前应用的根目录
<!--为整个web程序配置初始参数-->
<context-param>
<param-name>name</param-name>
<param-value>jim</param-value>
</context-param>
ServletContext servletContext = req.getServletContext();
System.out.println(servletContext);
System.out.println(servletContext.getInitParameter("name"));
servletContext.setAttribute("a","aaa");
System.out.println(servletContext.getAttribute("a"));
session
Servlet API中,定义了HttpSession接口,用来封装会话对象。
在第一次向servlet中发起请求时, 在服务器端,由服务器创建一个session对象,完成会话期间的管理
过程
使用session实现会话机制的过程
1、当容器创建一个新的HttpSession对象后,即生成一个随机数,称为 会话ID,并将ID值封装成一个名字为JSESSIONID的session,返回给客户端。
2、调用request.getSession方法获得会话对象时,容器先从request
中获取JSESSIONID值,根据JSESSIONID值查找到对应的会话对象,
返回使用。
3、如果没有获取到JSESSIONID值,认为当前的请求没有相关联的会话 对象,重复步骤1
方法
//获取session对象
HttpSession session = req.getSession();
//向session对象中设置一组键值,登录成功后将用户信息存储到一个对象的session对象中
session.setAttribute("user",user);
//在退出时销毁session对象,安全退出
HttpSession session = req.getSession();
session.invalidate();//销毁浏览器
User user = (User)req.getSession().getAttribute("user");
session生命周期
对象创建后保存在容器中,如果客户端连接到服务器后,不进行任何窗口,那么容器维护这些会话对象将占用很多资源。因此,容器都会在默认时间内销毁会话对象,多数容器默认30分钟销毁会话对象。
除了有效时间使会话对象失效外,还可以调用HttpSession中的invalidate方法,使会话失效,立即销毁会话对象
设置会话时间
可以在web.xml中进行配置,修改默认时间。例如,修改为10分钟销毁
<session-config>
<session-timeout>50</session-timeout>
</session-config>
可以使用HttpSession接口中的setMaxIntervalTime设置,以秒为单位,如果参数是负数,表示永远不失效。
例如:将会话的有效时长设置为2小时。
session.setMaxInactiveInterval(2*60*60);
session由谁创建?保存在哪?
有若干客户端与服务器连接,服务器会为每个客户端的一次会话创建一个会话对象。
过滤器
概念
过滤器位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求
在请求到达Servlet/JSP之前,过滤器截获请求
作用:在客户端的请求访问后端资源之前,拦截这些请求
相关API
Servlet API中,与过滤器有关的API共有三个接口,分别是
Filter、FilterChain、FilterConfig
Filter接口
Filter接口是过滤器类必须实现的接口,该接口中有三个方法。
1、init(FilterConfig filterConfig):该方法是对filter对象进行初始化
的方法,仅在容器初始化filter对象结束后被调用一次。参数
FilterConfig可以获得filter的初始化参数。
2、 doFilter(ServletRequest request, ServletResponse response,
FilterChain chain):该方法是filter进行过滤操作的方法,是最重
要的方法。过滤器实现类必须实现该方法。方法体中可以对request
和response进行预处理。其中FilterChain可以将处理后的request
和response对象传递到过滤链上的下一个资源。
3、destroy():该方法在容器销毁过滤器对象前被调用。
FilterChain接口
doFilter(ServletRequest request,ServletResponse response)
该方法可以将当前的请求和响应传递到过滤链上的下一个资源,可能 是下一个过滤器,也可能是目标资源。
FilterConfig接口
该接口类型作为Filter接口中的init方法的参数使用,FilterConfig接口
中有一个常用方法
getInitParameter(String name),该方法用来获得过滤器的初始
化参数值。在web.xml中,可以为每一个filter配置需要的初始化参
数,与Servlet的< init-param>类似。过滤器的初始化参数即可通过FilterConfig中的getInitParameter方法获取
<!--配置编码过滤器-->
<filter>
<filter-name>encod</filter-name>
<filter-class>com.ffyc.practice.filter.EncodFilter</filter-class>
<init-param>
<param-name>code</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encod</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
String code;
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("doFilter");
//设置编 码格式
servletRequest.setCharacterEncoding(code);
//让请求继续向下执行,下一个可能是目标servlet,也可能是下一个过滤
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init");
code = filterConfig.getInitParameter("code");
}
@Override
public void destroy() {
System.out.println("destroy");
}
总结
过滤器用来实现通用的功能,减少代码冗余,提高可维护性
一个过滤器可以配置给多个资源使用
一个资源也可以配置多个过滤器,按照配置顺序调用
监听器
Servlet监听器是Servlet规范中定义的一种特殊类,用于监听
ServletContext、HttpSession和ServletRequest等域对象的创建与
销毁事件,以及监听这些域对象中属性发生修改的事件。
监听器分类
按监听对象分类:
1、用于监听应用程序对象(Ser vletContext)
2、用于监听用户会话对象(HttpSeesion)
3、用于监听请求消息对象(Ser vletRequest)
按监听事件分类:
1、监听对象的创建和销毁的事件监听器。
2、监听对象属性变更(添加,修改,移除)的监听器
监听器接口
Servlet API中定义了监听器接口,用来监听不同的事件类型
● Ser vletContextListener:上下文监听器。
● Ser vletContextAttributeListener:上下文属性监听器。
● Ser vletRequestListener:请求监听器。
● Ser vletRequestAttributeListener:请求属性监听器。
● HttpSessionListener:会话监听器。
● HttpSessionAttributeListener:会话属性监听器。
创建监听器类
创建监听器类,实现监听器接口,在web.xml文件中配置监听器类。
< listener>
<listener-class> 监听器类全类名 </listener-class>
< /listener>