servlet&jsp
Servlet
(1)servlet基础
1)什么是servlet?SUN公司制定的一种用来扩展web服务器功能的组件规范。
a.用来扩展web服务器功能
web服务器(比如apache)只能够处理静态资源的请求,不能够处理动态资源的请求。
注: 静态资源指的是需要事先将html文件写好,并存放到web服务器上。
b.组件规范
1)什么是组件?
符合一定规范,实现部分功能,并且需要部署到相应的容器里面才能运行的软件模块。
2)什么是容器?
符合一定规范,提供组件的运行环境的程序。servlet是一个组件,需要部署到servlet容器里面才能运行。2)如何写一个servlet? (最原始写法)
step1,创建一个java类,实现Servlet接口或者继承HttpServlet抽象类。(一般情况下都是使用继承HttpServlet抽象类的方法)
step2,编译。
step3,打包。
创建一个具有如下结构的文件夹
appname(应用名)
WEB-INF
classes(放class文件)
lib(可选,放jar文件)
web.xml(描述文件 url-pattern)
step4,部署
将step3创建好的文件夹拷贝到容器。
注:可以使用jar命令将step3创建好的文件夹压缩成一个以".war"为后缀的文件然后再拷贝。
step5,访问
启动容器之后,打开浏览器,输入 http://ip:port/appname/url-pattern使用myeclipse开发一个简单的servlet
step1,启动myeclipse,集成tomcat。
step2,创建一个web工程
step3,编写Servlet类
step4,修改web.xml,添加上servlet描述
step5,部署
step6,访问
3)servlet是如何运行的?
比如,在浏览器地址栏输入http://ip:port/web01/hello
step1,浏览器依据ip,port建立连接。
step2,浏览器将相关的数据打包(请求数据包)发送给servlet容器。
step3,容器解析请求数据包,并且将解析之后的数据添加到request对象,同时,还会创建一个response对象。
step4,容器创建servlet对象,并调用该对象的service方法(会将request和response对象作为参数传递过来)。
注:可以利用request提供的方法来获得请求数据包中的数据(比如请求参数),并且可以将处理结果放到response。
step5,容器从response获取处理结果并打包(响应数据包),然后发送给浏览器。
step6,浏览器解析响应数据包,生成相应的页面。(1)什么是http协议?
由w3c制订的一种网络应用层协议,规定了浏览器与web服务器之间如何通信以及相应的数据包的结构。
1)如何通信?
step1,建立连接
step2,发送请求
step3,发送响应
step4,关闭连接
![]()
2)特点
"一次请求,一次连接"。 即如果浏览器要发送新的请求,需要重新建立新的连接。
3)优点
web服务器可以利用有限的连接为尽可 能多的请求服务。
(2)数据包的结构
1)请求数据包
请求行: 请求方式 请求资源路径 协议和版本 GET /favicon.ico HTTP/1.1
消息头: 是一些键值对,一般是由w3c制订的,有特定的含义。比如浏览器可以发送 "user-agent"消息头,告诉服务器,浏览器的类型和版本。
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0
实体内容: 只有发送post请求时,才会有数据。 即请求参数。
2)响应数据包
状态行: 协议和版本 状态码 状态描述
200 正确
500 系统错误
404 找不到资源
消息头:服务器也可以发送一些消息头
给浏览器,比如通过发送
"content-type"消息头告诉浏览器
,服务器返回的数据类型。
实体内容:程序的处理结果,浏览器解析
实体内容中的数据,生成相应的
页面。
(3)两种请求方式
1)get请求
a.哪一些情况下,浏览器会发送get请求?
a1.点击链接
a2.直接输入请求地址
a3.表单默认提交方式
b.特点
b1.将请求参数添加到请求资源路径的后面,所以,只能提交少量的数据。
b2.将请求参数显示在浏览器地址栏,不安全(比如路由器会记录包含了请求参数的地址)。
2)post请求
a.哪一些情况下,浏览器会发送post请求?
设置表单的提交方式为post。
b.特点
b1.将请求参数添加到实体内容里面,可以提交大量的数据。
b2.不会将请求参数显示在浏览器地址栏,相对安全。
注:不管什么请求方式,都不会对请求参数加密,所以,对于敏感数据,一定要加密处理。
(2)servlet核心
1)如何获得请求参数值?(1)String request.getParameter(String paramName);
注意:
a.请求参数名称必须与实际发送的参数名称一致,如果不一致,会获得null值。
b.该方法有可能返回""。
(2)String[] request.getParameterValues(String paramName);
注意:
a.有多个参数名相同时,使用该方法。
b.对于多选框,如果没有选择任何的选项,则获得null值。
2)表单包含有中文参数,如何处理?(1)乱码问题产生的原因
表单提交的时候,浏览器会对中文参数值进行编码,而服务器端,默认会使用iso-8859-1来解码。
注:会使用打开该表单所有的页面时的字符集来编码。
(2)解决方式
step1,浏览器端,使用指定的字符集来编码。
<meta http-equiv="content-type" content="text/html;charset=utf-8">
step2,服务器端,使用对应的字符集来解码。
方式一
request.setCharacterEncoding("utf-8");
注:只针对post请求有效。
方式二String uname = request.getParameter("uname");
uname = new String(uname.getBytes("iso-8859-1"),"utf-8");
3)servlet输出中文,如何处理?(1)乱码问题产生的原因
out.println方法在默认情况下,会使用iso-8859-1来编码。
(2)解决方式
response.setContentType("text/html;charset=utf-8");
这行代码的作用:
作用1:设置content-type消息头的值。
作用2:out.println方法会使用指定的字符集来编码。
4)容器如何处理请求资源路径?比如,在浏览器地址栏输入http://ip:port/web04-3/abc.html
浏览器会将"/web04-3/abc.html"作为请求资源路径发送给容器。
step1,容器依据"/web04-3"(应用名)找到应用所在的文件夹。
step2,容器默认认为访问的是一个servlet,所以,容器会去查找web.xml文件,找到匹配的servlet。
1)精确匹配
即要求<url-pattern>/abc.html</url-pattern>
2)通配符匹配
即使用"*"匹配零个或者多个字符。
比如 <url-pattern>/*</url-pattern>
3)后缀匹配
即使用"*."开头,后接多个字符。
比如 <url-pattern>*.do</url-pattern> 表示匹配所有以.do结尾的请求。
step3,如果找不到匹配的servlet,则容器会查找相应的文件。
5)如何将多个servlet合并成一个?step1,使用后缀匹配,比如
<servlet-mapping>
<servlet-name>ActionServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
step2,分析请求资源路径,依据分析的结果来选择相应的分支来处理。
String request.getRequestURI();
6)转发与重定向重定向
(1)什么是重定向?
服务器通知浏览器向一个新的地址发送请求。
注: 服务器可以发送一个302状态码和一个Location消息头(包含了一个地址,即重定向地址),浏览器收到之后,会立即向
重定向地址发送请求。
(2)怎样重定向?
response.sendRedirect(String url);
注:重定向之前,容器会先清空response缓存的所有数据。
(3)特点
a.重定向地址是任意的。
b.重定向之后,浏览器地址栏的地址会发生改变。转发
(1)什么是转发?
一个web组件将未完成的处理交给另外一个web组件继续做。
常见的场景:
servlet将处理结果交给jsp来展现。
注:web组件指的是servlet或者jsp。
(2)如何转发?
step1,绑订数据到request
request.setAttribute(String name,Object obj);
step2,获得转发器。
RequestDispatcher rd = request.getRequestDispatcher(String uri);
step3,转发
rd.forward(request,response);
注:该方法有可能返回null。
Object request.getAttribute(String name);
(3)特点
a.转发之后,浏览器地址栏的地址不变。
b.转发的目的地必须是属于同一个应用。重定向与转发的区别:
(1)能否共享request
转发可以,重定向不行。
注:当容器收到请求之后,会立即创建request和response,当容器发送响应之后,会立即销毁这两个对象。
(2)浏览器地址栏地址有无变化
转发不变,重定向会变。
(3)目的地有无限制
转发有限制(同一个应用),重定向不限。
7)servlet的生命周期(1)什么是servlet的生命周期?
容器如何创建servlet对象,如何对其进行初始化处理,如何调用该对象来处理请求,以及如何销毁该对象的整个过程。
(2)分成哪几个阶段?
1)实例化
a.什么是实例化?
容器创建servlet对象
b.什么时候实例化?
b1.容器收到请求之后。
b2.容器启动之后,事先创建好。
需要配置<load-on-startup>参数。
注意,容器在默认情况下,对于某个类型的servlet,只会创建一个实例。
2)初始化
a.什么是初始化?
容器调用servlet对象的init(ServletConfig config)方法。
b.init方法只会执行一次。
c.GenericServlet的init方法
将容器传递过来的ServletConfig保存下来,并且提供了一个方法(getServletConfig)来获得该对象。
注:可以通过override init()方法来实现自己的初始化处理逻辑。
d.初始化参数
step1,配置
<init-param>
<param-name>company</param-name>
<param-value>中信证券</param-value>
</init-param>
step2,读取
ServletConfig提供的getInitParameter方法。
3)就绪
a.什么是就绪
容器调用servlet对象的service方法处理请求。
b.HttpServlet的service方法
依据请求类型(get/post)调用对应的doGet/doPost方法。
注:可以通过override doGet/doPost或者override service方法来实现请求处理逻辑。
4)销毁
a.什么是销毁
容器在删除servlet对象之前,会先调用该对象的destroy方法。
b.该方法只会执行一次。(3)相关的几个类与接口
1)Servlet接口
a.init(ServletConfig config)
b.service()
c.destroy()
2)GenericServlet抽象类
实现了Servlet接口中的部分方法(init,destory)
3)HttpServlet抽象类
继承了GenericServlet,实现了service方法。8)servlet的线程安全问题
9)servlet上下文(ServletContext)
(3)状态管理
1)什么是状态管理?将浏览器与web服务器之间多次交互当作一个整体来看待,并且将多次交互所涉及的数据(即状态)保存下来。
2)Cookiea.什么是Cookie?
服务器临时保存在浏览器端的少量的数据。
b.cookie的工作原理
浏览器访问服务器时,服务器将少量数据以set-cookie消息头的方式发送给浏览器,浏览器会将这些数据保存下来;
当浏览器再次访问服务器时,会将之前保存的数据以cookie消息头的方式发送给服务器。
c.添加cookie
Cookie c = new Cookie(String name,String value);
response.addCookie(c);
d.读取cookie
Cookie[] request.getCookies();
注:该方法有可能返回null。
String cookie.getName();
String cookie.getValue();(1)什么是session?
服务器端为维护状态而创建的一个特殊的对象(session对象)。
(2)session的工作原理
浏览器访问服务器时,服务器会创建session对象(有一个唯一的id,称之为sessionId),服务器会将这个sessionID以cookie的方式
发送给浏览器。
当浏览器再次访问服务器时,会将sessionId发送给服务器,服务器端可以通过这个sessionId找到对应的session对象。
(3)如何获得session对象?
1)方式一
HttpSession s = request.getSession(boolean flag);
a.flag为true时:查看请求当中是否有sessionId,如果没有,则创建session对象;如果有,依据sessionId查找相应的 session对象,如果找到了则返回,找不到,创建一个新的session对象。
b.flag为false时:查看请求当中是否有sessionId,如果没有,返回null;如果有,依据sessionId查找相应的session对象,如果找到了则返回,找不到,返回null。
2)方式二
HttpSession s = request.getSession();等价于 request.getSession(true);
(4)HttpSession提供的几个重要方法
String getId();
setAttribute(String name,Object obj);
Object getAttribute(String name);
removeAttribute(String name);
(5)session超时
1)什么是session超时
服务器会将空闲时间过长的session对象删除掉。
注:为了节省内存空间资源。
2)服务器缺省超时限制
一般30分钟。
可以修改
<session-config>
<session-timeout>30</session-timeout>
</session-config>
注:不建议修改
3)setMaxInactiveInterval(int seconds);修改session的缺省时间限制
(6)删除session
session.invalidate()
![]()
(4)数据库访问
1)如何使用jdbc访问数据库?
2)使用dao访问数据库
(5)过滤器与监听器
1)什么是过滤器?servlet规范当中定义的一种特殊的组件,用来拦截容器的调用过程。
2)如何写一个过滤器?step1,实现Filter接口。
step2,在doFilter方法里面,编写拦截
处理逻辑。
step3,配置(web.xml)
3)过滤器的优先级如果有多个过滤器都满足过滤的条件,则容器依据<filter-mapping>的先后顺序来执行。
4)初始化参数step1,配置
<init-param>
<param-name>illgalStr</param-name>
<param-value>猪</param-value>
</init-param>step2,读取
String FilterConfig
.getInitParameter(String paramName)过滤器的优点:
1,在不修改程序代码的基础上,增加新的功能。
2,将多个组件相同的处理逻辑集中写在一个类里面(即过滤器),方便代码的维护。servlet规范当中定义的一种特殊的组件,用来监听容器产生的事件并进行处理。
注:主要有两大类事件
1)生命周期相关的事件
容器创建或者销毁了request,session,servlet上下文产生的事件。
2)绑订数据相关的事件
容器调用了request,session,servlet上下文的setAttribute,removeAttribute产生的事件。
6)如何写一个监听器?step1,依据要监听的事件类型选择相应的监听器接口。
注:比如要监听session的创建和销毁,应该实现HttpSessionListener接口。
step2,在接口方法当中,实现监听处理逻辑。
step3,注册(web.xml配置监听器)
(6)典型案例
员工管理
登录
session验证
验证码