Servlet
1.什么是Servlet?
(1)Servlet,全程Java Servlt。是用Java代码编写的服务器程序,其只要功能在于交互式浏览器和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。
(2)Serlvlet运行支持Java的应用服务器中。从现实上讲,Servlet可以响应人任何类型的请求,但绝大多数情况下Serlet只用来扩展基于HTTP协议的Web服务器。
(3)Servelt工作模式:
①客户端发送请求至服务器
②服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器
③服务器响应返回客户端
Servlet工作原理
(1)Servlet接口定义了Servlet与servlet容器之间的契约。这个契约是:Servlet容器将Servlet类载入内存。并产生Servlet实例和调用它的具体方法。但要注意的是,在一个应用程序中, 每种Servlet类型只能有一个实例。
(2)用户请求致使Servler容器调用Servlet的Service();方法,并传入一个ServletRequest对象和一个ServletResopnse对象。ServletRequest对象和ServletResopnse对象都是有Servlet容器(例如TomCat)封装好的,并不需要程序员去实现,程序员可以之间使用这两个对象。
(3)ServletRequest中封装了当前的Http请求,因此,开发人员不必解析和操作原始的Htpp数据。ServletResopnse表示当前用户的Htto响应,程序员只需要操作ServletResopnse容器对象就能把响应轻松的发给用户
(4)对于每一个应用程序,Servlet容器还会创建一个ServletContext对象。这个对象中封装了上下文的环境详情。每个应该程序只有一个ServletContext。每个Servlet对象也都有一个封装Servlet配置的ServletConfig对象。
Servlet生命周期
当客户端首次发送第一次请求后,由容器(Web服务器(TomCat))去解析请求,根据请求到对应的servlet,判断该类的对象是否存在,不存在则创建servlet实例,调取init()方法进行初始化操作,初始化完成后调取doPost().处理方法完成后,作出响应结果给客户端,单次请求处理完毕。
当用户发送第二次以后的请求时,会判断对象是否存在,但是不执行init(),而直接执行service方法,调取doGet()/doPost()方法。当服务器关闭时调取dostoty方法进行销毁。
四个过程:(1)实例化 --先创建servlet实例
(2)初始化 --init()
(3)处理请求 --service()
(4)服务终止 --destory()
请求
Http ServletRequest表示Http环境中的Servlet请求。它扩展于javax.sertvlet.ServletRequest接口。
常用方法:
(1)Stiring getParameters(String name),根据表单组件名称获取提交数据,返回值是Sting
注:服务器在接受数据时使用字符串统一接收
(2)String[] getParameterValues(String name),获取表单组件对应多个值时的请求数据
(3)void setCharacterEncoding(String charset)指定每个请求的编码(针对post请求才起作用)
(4)RequestDispatcher getRequestDispatcher(String path) --跳转页面
(5)存值: request.setAttribute(“key”,”value”)
(6)取值 request.getAttribute(“key”)//取值后需要向下转型
示例:String a=(String)request.getAttribute(“uname”);
get和post的区别
1.GET请求,请求的数据会附加在URL之后,以?分隔URL和传输数据,多个参数使用&连接。URL的编码格式采用的是ASCII编码,而不是unicode,即使所有的非ASCII字符都要编码之后再传输。
2.传输数据的大小
在HTTP规范中,没有对URL的长度和传输的数据大小进行限制。但是在实际开发过程中,对于GET,特定的浏览器和服务器对URL的长度有限制。因此,在使用GET请求时。传输数据会受到URL长度的限制。对于POST,由于不是URL传值,理论上是不会受限制的,但是实际上各个服务器会规定对POST提交数据大小进行限制,Apache、IIS都有各自的配置
3.POST的安全性比GET高。这里的安全是指真正的安全,而不同于上面GET提到的安全方法中的安全,上面提到的安全仅仅是不修改服务器的数据。比如,在进行登录操作,通过GET请求,用户名和密码都会暴露在URL上,因为登录页面有可能被浏览器缓存以及其他人查看浏览器的历史记录的原因,此时的用户名和密码就很容易被他人拿到了。除此之外,GET请求提交的数据还可能会造成Croos-site request frogery攻击
响应
在Service API中,定义了一个HttpServletResponse接口,它继承自ServletResponse接口,专门用来封装HTTP响应消息。在HTTPServletResponse接口中定义了向客户端发送响应状态码,响应消息头,响应消息体的放方法。
常用方法:
void addCookie(Coolkie var1); 给这个响应添加一个Cookie
void sendRedirect(String var1); 发送一条响应码,将浏览器跳转到指定位置
PrintWriter getWriter() 获得字符流,通过字符流的write(String s)方法可以将字符串设置的respoonse缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。
setContentType() 设置响应内容的类型
重定向和转发的对比
重定向:response.sendRedirect()
转发:request.getRequestDispatcher(“页面(/sucess.jsp)”).forwar(request,response)
相同点:都是用来跳转页面
不同点:
1.重定向时地址栏会改变,request中存储的数据会丢失,转发时地址栏显示的是请求页面的地址,request数据可以保存。
2.转发属于异常请求一次响应,重定向属于两次请求(地址栏修改了两次)两次响应。
补充:使用out对象往页面输出js或者 html,css.使用js跳转页面request数据也会丢失。
会话
request存的值只能在单次请求中保存,保存的数据不能跨页面,重定向时,request存的值会丢失
session的数据可以在多个页面中共享,即使重定向页面,数据不会丢失
session中可以包含n个request
会话的概念:从打浏览器到关闭浏览器,期间访问服务器期间就称为一次会话。
常用方法:
void setAttribute(String key,Object value) 以key/value的形式保存对象值,将数据存储在服务器端
Object getttribute(String key) 通过key获取对象值
void invalidate() 设置session对象失效
String getId() 获取sessionId,当一次登录成功后,session会产生一个唯一的id,浏览器之后的访问时如果发现id值还是之前的id,那么说明当前访问的属于同一个会话。
void setMaxInactiveInterval(int interval) 设定session的非活动时间,当我们访问一个页面时,在设定时间期间用户没有进行任何操作那么到设定时间会关闭session会话
获取初始化参数
用户在输入中文字符时,放回给服务器的数据可能会出现乱码,
可以使用request.setCharacterEncoding(“utf-8”)来设置字符集,当时代码的耦合度太高,不便于后期的维护和修改。那么就可以用初始化参数。
实现方式:
(1)web.xml文件中先定义初始化参数
<servlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</servlet>
(2)在servlet中获取初始化参数,重新init()方法
public void init(ServletConfig config) throws ServletException {
encoding= config.getInitParameter("encoding");
}
注意:这种方式的初始化参数仅限于当前的servlet使用。
2.定义全局初始化参数
(1)定义,context-param是和servlet同级别
<context-param>
<param-name>命名</param-name>
<param-value>utf-8</param-value>
</context-param>
(2)获取数据
@Override // 请求->init()->service()->doget/dopost->destory();
public void init(ServletConfig config) throws ServletException {
bianhao=config.getServletContext().getInitParameter("bianma");
}