Servlet 是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和 HTTP服务器上的数据库或应用程序之间的中间层。使用 Servlet可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。本章内容详细讲解了web开发的相关内容以及servlet相关内容的配置使用,是JAVAEE开发的重中之重。
web:在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源。
javaweb:使用java技术开发web页面。
Web服务器:接收客户端的请求,给客户端作出响应。学习web开发,需要先安装一台web服务器,将开发好的web项目 部署在web服务器中供外界访问。
web程序: 所有的程序部署在服务器端,通过浏览器远程访问。
服务器: 提供服务,接收请求,响应
广义 软件+硬件
狭义 软件(程序) 放置文件(项目) 供英特网中的其它电脑访问。
服务器<==>web容器<==>中间件(连接用户请求与程序)
在小型的应用系统或者有特殊需要的系统中,可以使用一个免费的Web服务器: Apache 的Tomcat,该服务器支持全部JSP以及Servlet规范.
Tomcat服务器由Apache提供,开源免费。由于Sun和其他公司参与到了Tomcat的开发中,所以最新的JSP/Servlet规范总是能在Tomcat中体现出来。
Tomcat 的下载与安装
1.官网下载解压 下载地址:http://tomcat.apache.org/
2.配置JAVA_HOME环境变量 D:\ProgramFiles\Java\jdk1.8.0_261(TOMCAT根据java_home去查找jdk安装位置)
3.在tomcat的bin目录 双击运行 startup.bat命令 启动tomcat
下面用一张图展示Tomcat的目录层次结构
server.xml是Tomcat的配置文件,可以在这里面修改Tomcat的端口号。
在idea中创建一个基本的java项目
右键 add webframework 变为web项目
项目
src java代码
web 配置文件 网页代码
部署项目
1.手动部署 自己把项目中的代码粘贴到服务器中, 平时开发不用
2.自动部署 在idea中集成tomcat
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程序。
4.最后,通过浏览器访问配置的url-pattern。
怎么配置url-pattern?
1.用<servlet>元素注册Servlet
<servlet-name>:设置注册名称
<servlet-class>:servlet完整类名
2.用<servlet-mapping>元素映射一个已经注册的Servlet的对外访问路径
<servlet-name>:servlet注册名称
<url-pattern>:servlet对外访问路径
url-pattern配置模式:
1."/"代表当前web应用的根目录
2.精确匹配 例如:/test
3.匹配任意的url 例如:/*
<servlet>
<servlet-name>demoservlet-name>
<servlet-class>com.ffyc.firstweb.servlet.ServletDemoservlet-class>
servlet>
<servlet-mapping>
<servlet-name>demoservlet-name>
<url-pattern>/demourlurl-pattern>
servlet-mapping>
web.xml文件为web应用的配置文件,它必须放在web应用 目录WEB-INF目录下。
web.xml文件用于对web应用下的web资源进行配置,服务 器在启动时会读取web.xml文件中的内容。
超文本传输协议 (HyperText Transfer Protocol)服务器传输超文本 到本地浏览器的传送协议,是互联网上应用最为流行的一种网络协议,用于 定义客户端浏览器和服务器之间交换数据的过程。
● HTTP是一个基于TCP/IP通信协议来传递数据.
● HTTP是一个属于应用层的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统
客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送 了一个http请求。 请求包括: 请求行,请求头,请求体
请求行包含 http请求方式,请求资源名称,http版本 (例如post test.jsp HTTP/1.1)
请求头包含主机地址,以及客户端的一些环境信息,以键值对的形式传递
请求体代表着浏览器在post请求方式中传递给服务器的参数
请求体中参数以 键值形式传递,多个用&链接,服务器接收到后再解析. username=admin&userpwd=123
GET方式:
1.超链接访问,默认是GET方式
2.form提交,不指定method,默认为GET方式
POST方式:
form提交,指定method=“POST”
Get方式与post方式的区别
1.Get方式主要是从服务器获取信息;post主要是想服务器提交信息
2. Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据 放置在请求体中提交。 ● GET方式提交的数据大小受限制一般1kb(不同浏览器也会有不同);而 POST则没有此限制。
1.HttpServletRequest是ServletRequest的子接口
2.HttpServletRequest比ServletRequest多了一些针对于Http协议的方法。
请求和响应是Web交互最基本的模式,在Servlet中,用HttpServletRequest 来表示请求。 HttpServletRequest :封装了请求的信息,可以从中获取任何请求信息
request获取请求参数
1.getParameter(name) — String 通过name获得值
2.getParameterValues — String[ ] 通过name获得多值
中文乱码问题,设置编码格式
setCharacterEncoding(编码格式)
一个http响应代表服务器向客户端回送的数据,它包括:响应行,响应头,响应体。
响应行里包含了http协议版本,以及用于描述服务器对请求的处理结果。
HTTP/1.1 (协议版本) 200(状态吗) OK(状态码描述)
响应头用于描述服务器的基本信息,以及数据描述
Ser ver Apache-Coyote/1.1
Content-Type text /html;char set=UTF-8
Content-Length 0 Date Wed, 13 Sep 2017 02:26:07 GMT
状态码:服务器和浏览器用于确定状态的固定数字号码
200:请求成功
302:请求重定向
400:语义有误,当前请求无法被服务器理解或请求参数有误
404:请求资源不存在,通常是路径写错了或者服务器资源删除了
500:服务内部错误(代码异常)
● HttpServletResponse是ServletResponse的子接口 。
● Web服务器收到客户端的http请求,会针对每一次请求,分别创建 一个代表响应的HttpServletResponse对象。
● HttpServletResponse对象代表响应。
●用getWriter()获得一个PrintWriter字符输出流输出数据 response会默认以ISO8859-1将需要输出到浏览器的字符进行解码, 如果输出的字符在ISO8859-1中不存在,就会导致乱码问题。
● response.setContetnType(“text/html;charset=utf-8”)方法,可以同时设定response所使用的字符集编码和浏览器打开所用的字符集编码。
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/* 接收请求体的信息*/
/*RequestFacade实现了req接口,tomcat自动把RequestFacade封装到HttpServletRequest中,多态(父类引用指向子类对象),然后调用RequestFacade
实现的方法(编译看左边,运行看右边)*/
//req.setCharacterEncoding("utf-8");
PrintWriter out=null;
resp.setContentType("text/html; charset=utf-8");
out=resp.getWriter();
int result=0;
try {
result=new RegisterDao().save(req.getParameter("account"),req.getParameter("password"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
if(result==0){
out.println(0);
}else{
out.println(1);
}
}
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的 ServletContext对象。
由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此 Servlet对象之间可以通过ServletContext对象来实现数据交互,存储一些全局信息。
<context-param>
<param-name>nameparam-name>
<param-value>jimparam-value>
context-param>
public void init(ServletConfig config) throws ServletException {
ServletContext context=config.getServletContext();
System.out.println(context.getInitParameter("name"));
context.setAttribute("age",12);
}
Session对象是javax.servlet.http.HttpSession的实例
在第一次向servlet中发起请求时, 在服务器端,由服务器创建一个session对象,完成会话期间的管理
会话: 客户端浏览器和服务器交互的整个过程, 从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束
Servlet API中,定义了HttpSession接口,用来封装会话对象。
● HttpSession是接口,会话对象是Web容器创建的,在Servlet中使用 HttpServletRequest中的方法获得会话对象。
● public HttpSession getSession():获取跟当前请求相关的 session,如果不存在session,就创建一个新的session对象返回。
使用session实现会话机制的过程
1、当容器创建一个新的HttpSession对象后,即生成一个随机数,称为 会话ID,并将ID值封装成一个名字为JSESSIONID的session,返回给 客户端。
2、调用request.getSession方法获得会话对象时,容器先从request 中获取JSESSIONID值,根据JSESSIONID值查找到对应的会话对象, 返回使用。
3、如果没有获取到JSESSIONID值,认为当前的请求没有相关联的会话 对象,重复步骤1
/*获取跟当前请求相关的 session,如果不存在session,就创建一个新的session对象返回*/
HttpSession session=req.getSession();
/*以key/value的形式保存对象值*/
/* 当session对象长时间不用或者服务器关闭时(也可以调用方法关闭),服务器的session对象自动销毁,user对象也不在存在,*/
session.setAttribute("user",user);
/*销毁session对象*/
session.invalidate();
会话对象是容器创建的,并保存在容器中
1.客户端连接后长时间不操作,维护这些会话对象
需要很多资源,服务器会在默认时间后销毁这些对象,多数容器默认30分钟销毁
2.调用HttpSession中的invalidate()方法销毁
3.服务器关闭时销毁
设置会话时间
1.在web.xml中进行配置,修改默认时间
例:修改为50分钟销毁
<session-config>
<session-timeout>50session-timeout>
session-config>
2.HttpSession接口中的setMaxIntervalTime设置,以秒为单位,如果 参数是负数,表示永远不失效
将会话的有效时长设置为2小时
session.setMaxInactiveInterval(26060)
有若干客户端与服务器连接,服务器会为每个客户端的一次会话创建一个会话对象
过滤器:位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求,在请求到达Servlet/JSP之前,过滤器截获请求。
作用:
在客户端的请求访问后端资源之前,拦截这些请求。
ServletAPI 中,与过滤器有关的API共有三个接口,分别是
● Filter ● FilterChain ● FilterConfig
Filter接口
1. init(FilterConfig filterConfig)方法:对filter对象进行初始化,只调用一次, FilterConfig可以获得filter的初始化参数。
2.doFilter(ServletRequest request, ServletResponse response, FilterChain chain):过滤器必须要实现的方法,对request或者response进行预处理(例如utf-8编码处理)。FilterChain可以把处理后的对象传递给下一个资源。
3.destroy():该方法在容器销毁过滤器对象前被调用
FilterChain接口
1.doFilter(ServletRequest request,ServletResponse response):把处理后的对象传递给下一个资源
FilterConfig接口
作为Filter接口中的init方法的参数使用
1.getInitParameter(String name),该方法用来获得过滤器的初始化参数值。
public class EncodeFilter implements Filter {
public static String encode;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
encode=filterConfig.getInitParameter("encode");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding(encode);
filterChain.doFilter(servletRequest,servletResponse);
}
}
<filter>
<filter-name>encodefilter-name>
<filter-class>com.ffyc.firstweb.filter.EncodeFilterfilter-class>
<init-param>
<param-name>encodeparam-name>
<param-value>utf-8param-value>
init-param>
filter>
<filter-mapping>
<filter-name>encodefilter-name>
<url-pattern>/back/*url-pattern>
filter-mapping>
<filter>
<filter-name>emptyfilter-name>
<filter-class>com.ffyc.firstweb.filter.IsEmptyFilterfilter-class>
filter>
<filter-mapping>
<filter-name>emptyfilter-name>
<url-pattern>/back/*url-pattern>
filter-mapping>
● 过滤器用来实现通用的功能,减少代码冗余,提高可维护性
● 一个过滤器可以配置给多个资源使用
● 一个资源也可以配置多个过滤器,按照配置顺序调用
Servlet API中定义了监听器接口,用来监听不同的事件类型
public class Listen implements ServletContextListener, ServletRequestListener, HttpSessionListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("上下文监听器创建");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("上下文监听器毁灭");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("请求监听器创建");
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("请求监听器毁灭");
}
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("会话监听器创建");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("会话监听器毁灭");
}
}
创建监听器类,实现监听器接口,在web.xml文件中配置监听器类。
<listener>
<listener-class>com.ffyc.firstweb.listener.Listenlistener-class>
listener>
servlet是业务逻辑层的一个重要内容,起到了连接表现层和数据访问层的关键作用。本章的重点内容是web开发概述以及servlet的相关内容,包括http、servlet的生命周期、session会话对象的生命周期、过滤器。作为java开发人员,必须熟系web开发的流程,学好web开发的基本技术,为以后的框架学习打下坚实的基础。