Servlet && Filter
j2ee源码位置:D:\MainSoftWare\myeclipse安装包\javaee源码
快捷键:重新打开myeclipse-->快捷键ctrl+e
Servlet3.0规范中,新增metadata-complete:为true时,web应用将不会加载注解配置的Web组件(Servlet、Filter、Listener等);
AsyncContext startAsync() 和startAsync(ServletRequest ,ServletResponse); 异步处理操作
1.http协议:超文本传输协议,传输html 1.http协议是单向性的协议,先请求,后响应
2.http协议执行过程:http1.1开始有长连接的概念(可以多次发送请求,多个响应请求)
a.建立连接
b.发送请求
c.响应请求
d.断开连接
3.无状态的协议,只负责传输,对事物的处理没有记忆性
1.客户端存储信息:cookie
2.服务器存储信息:session
4.http请求信息:url:绝对资源路径 uri本机的相对路径
URI属于父类,而URL属于URI的子类。URI的定义是:统一资源标识符;对于URL的定义是:统一资源定位符。
区别在于,URI表示请求服务器的路径,定义这么一个资源。而URL同时说明要如何访问这个资源(http://)。
请求行:请求方式、资源路径、协议和协议版本号
请求头: 若干请求头
请求正文: get请求,请求的内容放在url地址栏;post请求,请求内容放在请求的内容body中
5.响应信息:
响应行:协议和协议版本号 响应的状态码(200,404,405,500) 状态码描述(OK)
响应头:若干响应头
响应正文:
2.使用Servlet:
a在tomcat上运行的其实就是WebRoot下的文件,因为src目录下的文件会自动被编译生成对应的class文件在web-Inf/class目录下
b.创建Servlet步骤:
1:新建 web project,写上项目名称
2:选择javaEE 5 选web 2.5 ---完成
3:新建一个类,类要继承 httpSevlet
4:重写service方法
5:配置web.xml
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>com.bjsxt.myServlet.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
注解式Servlet 访问时项目名/getapp
@WebServlet(name="getApplicationAttribute",urlPatterns="/getapp") //urlPatterns和value作用一样
public class GetApplicationServlet extends HttpServlet{
protected void service(HttpServletRequest req, HttpServletResponse res) web.xml形式:load-on-startup:指定的数值越小,优先级越高
注解形式: loadOnStartup

注解配置初始参数: servlet-api.jar 注解需要加此包

用户可以有多种方式访问Servlet,常见的有 浏览器地址栏访问、请求转发、重定向 form表单提交、
超链接指向 。
3.getOutputStream和getWriter区别:
1.getOutputStream:返回Servlet引擎创建的ServletOutputStream字节输出流对象,按字节形式输出响应正文。
2.getWriter:返回Servlet引擎创建的将Servlet引擎的数据缓冲区包装成PrintWriter字符输出流对象,按字符形式输出响应正文。
3.getOutputStream和getWriter:两者互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。
4.当service方法结束后,Servlet引擎将检查getWriter或getOutputStream输出流对象是否已经调用过close方法,
4.当service方法结束后,Servlet引擎将检查getWriter或getOutputStream输出流对象是否已经调用过close方法,
如果没有,Servlet引擎将调用close方法关闭该输出流对象。
4.如何避免405错误
1.当实现类重写了service方法,就不能再调用父类(HttpServlet)的service 推荐
2.如实现类重写service方法,并且调用了父类的service方法,则需要重写doGet或者doPost,
并且不能再调用父类的doGet或doPost
3.直接重写doGet或doPost
5.常见的url形式:
<url-pattern>/FirstServlet</url-pattern> //匹配FirstServlet请求
<url-pattern>/one/*</url-pattern> //匹配one目录下的所有请求
<url-pattern>*.aaa</url-pattern> //匹配所有以aaa结尾的请求
错误:<url-pattern>/one/*.aaa</url-pattern>
7.Servlet生命周期:
默认懒汉单例模式,修改load-on-startup参数值(值越小,优先级越高,依次加载),变成饿汉模式
1.加载初始化只执行一遍
2.调用init(),创建对象,只执行一遍
3.每个请求,servlet容器会new一个新的线程,调用service-->super.service-->doGet/doPost
不要在Servlet中使用成员变量(因为当多个用户访问同一个对象的时候,可能会造成数据不安全(数据错乱));
4.destroy 销毁Servlet
8.HttpServletRequest:由Servlet容器(tomcat等)创建,该对象包含了所有http协议的请求信息
getMethod()和getContextPath() 常用
getHeaderNames() 返回枚举类型Enumeration
getParamter("name") 当name对应的jsp中找不到时,获取的内容是null
当name可以找到时,但是这个名词值为"",则获取的内容也是""


9.HttpServletResponse:
//响应行内容不需要我们处理,浏览器自动处理;
当手动设置响应头时,同名的响应头会被覆盖 //setHeader
添加响应头,同名的响应头不会被覆盖 //addHeader
10.乱码问题:
post 请求时处理
1.jsp页面设置pageEncoding="utf-8"
2.servlet: req.setCharacterEncoding("utf-8"); //设置请求信息的解码格式
post响应信息处理:
1.resp.setContentType("text/html;charset=utf-8");
resp.setCharacterEncoding("utf-8");
resp.getWriter.print("中文");
get处理:
1.跟post一样
2.还要在tomcat的conf/server.xml进行修改 useBodyEncodingForURI="true"
11.forward():同一web应用内,把请求转发给目标组件
1.发生一次请求,url地址不会改变
2.(在一个组件内已经请求转发过,不能再请求转发(可能出现500错误))避免多次请求转发,直接在forward之后加return;
但是不同组件之间可以多次请求转发
3.可以携带请求参数信息;效率相对较高
4.使用场景:如登录页面;通常用于服务器内部资源跳转的时候用
req.getRequestDispatcher("ServletRequest02").forward(req, resp); //转发应该发生在同级目录
req.getRequestDispatcher("/index.jsp").forward(req, resp); 加/代表从根目录转
req.getRequestDispatcher("xxx/index.jsp").forward(req, resp); 或者加xxx/xxx.jsp
<a href="servlet/ServletCharset?username=中文&pwd=sss">打开网页</a>
include():包含目标组件的响应结果
a.目标为Servlet或Jsp,调用service(),把响应正文添加到源组件的响应结果中;
HTML直接把内容添加到源组件的响应结果中。
b.返回源组件中,继续执行后续代码。
servlet获取RequestDispatcher对象的两种方式:
ServletContext的getRequestDispatcher(path) //path为绝对路径 以“/”开头的路径
ServletRequest的getRequestDispatcher(path) //path为相对路径 不以“/” 开头的路径
dispatcher.forward(req,res);
dispatcher.include(req,res);
6.重定向:链接类似,可以发生在不同web应用
1.发生两次请求;url地址栏会改变
2.(在一个组件内已经重定向过,不能再重定向(可能出现500错误))避免多次重定向,直接在sendRedirect之后加return;
但是不同组件之间可以多次重定向
3.不可以携带请求参数信息,但是可以把请求参数写在重定向的地址后面(不推荐使用,如果想带参数,使用forward)
4.效率相对较低
5.退出登录时使用,访问的资源在服务器外部时,必须使用重定向
4.location 以“/”开头表示相对于当前服务器根路径的URL;以http://开头,表示一个完整的URL;可以是web内部组件也可以是任意网页。
res.sendRedirect("/helloApp/output?msg="+message);
7.cookie:
1.将http协议信息保存在客户端的技术
2.Cookie由服务器Servlet创建,由servlet服务器发送给浏览器,最终被浏览器保存,
当再次访问servlet的时候会带上cookie信息。
3.当cookie没有设置有效时间,则cookie会保存在浏览器的内存中,当关闭浏览器,cookie就会被销毁。
4.设置cookie有效期后,则会保存在硬盘。
5.cookie信息如果同名,客户端保存信息时会被覆盖
Cookie cookie=new Cookie("user","kkk"); //创建cookie
cookie.setMaxAge(60*60); //单位秒
nameCookie.setPath(req.getContextPath()+"/SetCookie");
//设置浏览器存放路径,访问mydemo/SetCookie才会显示该cookie SetCookie为form的action名字(
即servlet的url-pattern)
resp.addCookie(cookie); //发送cookie
查看cookie:
Cookie[] cook=req.getCookies();
c.getName(); c.getValue();
8.session(服务器端):
会话:相当于客户端和服务器端的多个请求和响应
会话开始:客户端发送请求
会话结束:
客户端结束:关闭浏览器:清除cookie信息,sessionId也随之被销毁
服务端结束:a:session超时 b:超过最大不活动周期 c:强制session失效
1.适合保存大量的数据,安全,效率高,session跟踪机制需要cookie来保存和传递sessionId
能否取消cookie? 不能,因为session的id需要cookie来保存, 也称session的跟踪机制
cookie(客户端):不适合保存大量的数据,不安全,效率低。
2.强制session失效 req.getSession().invalidate();//全部的session失效?
移除会话: req.getSession().removeAttribute("userRealName");
设置session有效时间,单位分钟
a.在项目web.xml配置
b.在tomcat的web.xml配置
<session-config>
<session-timeout>10</session-timeout>
</session-config> c.设置最大不活动周期:
session.setMaxInactiveInterval(10); 10秒最大不访问
9.获取初始化信息servletConfig:
ServletConfig sc=this.getServletConfig();
sc.getInitParameter() //获取web.xml中init-param的参数值
10.一个web应用只有一个ServletContext对象,所有的servlet都共享这个ServletContext对象(又称application对象,作用域)
三种方式获取ServletContext:
1.ServeltContext sc=this.getServletContext(); sc.getContentPath() 同req.getContextPath()效果相同
2.ServletContext sc02=this.getServletConfig().getServletContext();
3.ServletContext sc02=this.getSession().getServletContext()
sc.getRealPath() //获取文件绝对路径(包含项目部署在tomcat下的绝对路径)
sc.getResourcepath() //获取文件夹下的文件路径(只能作用倒数一层);
sc.getResourceAsStream(“/index.jsp”) //获取资源文件
11.作用域:
UUID uuid=UUID.randomUUID(); //生成不重复的一个随机字符串
uuid.toString().replaceAll("-",""); //将 - 替换成空串,常用于公司数据库表的id
生命周期:数据在web应用内部传递(同时满足:1.生命周期 2.作用范围)
req:在一次请求之间
session:
开始:客户端第一次发生请求就开始
结束:1.客户端关闭浏览器(丢失JsessionID) 2.设置session超时时间 3.强制session失效
ServletContext:
开始:web项目启动时候就存在
结束:服务器停止
作用范围:
req:所有被请求转发过的Servlet
session:作用于所有的Servlet
ServletContext:作用于所有的Servlet
使用方式:request:和当次请求相关的内容用request作用域
session:和当前用户相关的信息用session作用域
ServletContext:存放公共不常改变的数据
12.路径问题:
a.请求转发/跳转到项目根目录
req.getRequestDispatcher("/").forward(req,resp);
b.重定向/跳转到服务器根目录:
resp.sendRedirect("/");
return;
服务器根目录:http://localhost:8080/
Filter:
1.对用户请求进行预处理,再将请求交给Servlet进行处理并生成响应,最后对服务器响应进行处理。
创建流程:
a.创建Filter b.在web进行配置
chain.doFilter(),之前进行数据的请求处理;之后对服务器响应的处理。
2.URL Rewrite: http://download.csdn.net/download/bestbanana/5839169
3.自定义拦截器,实现Filter
web.xml中,监听器配置在过滤器的下面,Servlet的上面
过滤器在项目启动的时候,就会被加载,但不关心加载顺序,只关注执行的顺序(满足前提条件下,顺序与配置有关系)
filter-mapping可以搭配servlet-name一起使用
Listener:
a.主要监听生命周期(init destroy) b.作用域的变化
1.ServletContextListener:监听web的启动和关闭
2.ServletContextAttributeListener:监听ServletContext(application)范围内属性的改变
3.ServletRequestListener:监听用户的请求
4.ServletRequestAttributeListener:监听用户ServletRequest(request)的属性改变
5.HttpSessionListener:监听用户session的开始和结束
6.HttpSessionAttributeListener:监听用户session的属性改变

posted on 2018-03-06 18:04 xiaojiayu0011 阅读(156) 评论(0) 收藏 举报
浙公网安备 33010602011771号