Servlet基础学习指导

一、Servlet
1.servlet的概念:
sun提供的开发动态web资源的技术,本质上是一段java小程序。可以配置到    web应用中在servlet容器中运行。
2.Servlet开发步骤
写一个java类Servlet接口
在web.xml中对这个Servlet进行配置
二、Servlet继承结构
Servlet -- 接口 定义了Servlet的基本的方法
|
|--GenericServlet 抽象类 通用Servlet 实现了Servlet接口中的大部分     方法,只有service方法没有实现
|
|--HttpServlet 类 继承了GenericServlet,在GenericServlet的基础上增加了很多和HTTP协议相关的支持,实现了Service方法,在service方法中判断当前的请求         方式,调用对应的doXXX方法。我们继承HttpServlet,不会直接覆盖service,只需要覆盖doGet 和 doPost,针对get和post提交做处理即可。
三、Servlet调用过程图及生命周期:

Servlet会在第一次被访问时创建出来。创建出来后立即调用init方法执行初始化的操作。从此以后驻留在内存中为后续的请求服务。每当由请求访问该Servlet时,都会导致     service方法执行。直到服务器关闭或web应用移除出容器时,随着web应用的销毁,Servlet被销毁,在销毁Servlet之前调用destory方法执行一些善后的工作。


四、Servlet在web.xml中配置细节
<servlet> -- 配置一个Servlet
<servlet-name>SecondServlet</servlet-name> -- 为Servlet起一个名字
<servlet-class>cn.com.tarena.web.SecondServlet</servlet-class> -- Servlet处理类的全路径名称
<init-param> -- 配置初始化参数,可以不想在Servlet中写死的内容配置在此处,通过ServletConfig对象可以获取,可以配置多个
<param-name>name1</param-name> --参数名
<param-value>value1</param-value> --参数值
</init-param>
<load-on-startup>1</load-on-startup> -- 可选项,一旦配置了这个选项,则这个Servlet会在web应用加载时立即创建。
</servlet>
<servlet-mapping> -- 一个Servlet可以 配置多个Servlet-Mapping
<servlet-name>SecondServlet</servlet-name> -- 为哪个名字的Servlet配置
<url-pattern>/servlet/SecondServlet</url-pattern> -- 配置为哪个虚拟路径,通过这个虚拟路径就可以访问这个Servlet
</servlet-mapping>


<url-pattern>配置的细节:
可以直接写一个路径
可以使用*匹配符,但是只能时/开头/*结尾 或 *.后缀 的形式
由于*号匹配符的引入,可能会造成一个访问路径被多个url-pattern所匹配,那到底哪一个起作用呢?
匹配的规则是 哪个最像找哪个,*.后缀 永远优先级最低。


如果某一个Servlet的对外访问路径被配置为了一根正斜杠,则改Servlet成为缺省Servlet,其他Servlet不处理的请求由他来处理。
其实访问任何资源最终都时由Servlet输出的,包括静态资源和404也是由在tomcat中conf文件中的web.xml中配置的缺省Servlet输出的
一般不要自己配置缺省Servlet,配了就无法访问静态web资源和404页面了
五、ServletConfig
代表当前Servlet在web.xml中的配置信息
获取当前Servlet中配置的初始化参数
getInitParameter
getInitParameterNames
获取ServletContext对象

六、Request
ServletRequest--通用的Request,提供了一个Request应该具有的基本方法
|
|--HttpServletRequest -- 在ServletRequest的基础上增加了一些和Http协议相关的方法 HttpServletRequest是一个接口,被HttpServletRequestWrapper类实现。
同时HttpServletRequestWrapper类继承ServletRequestWrapper,在重写HttpServletRequest接口中的方法,调用ServletRequestWrapper中的方法。


代表一个请求


获取客户机信息
getRequestURL 方法返回客户端发出请求完整URL
getRequestURI 方法返回请求行中的资源名部分
getQueryString 方法返回请求行中的参数部分
getRemoteAddr方法返回发出请求的客户机的IP地址
getMethod 得到客户机请求方式
getContextPath 获得当前web应用虚拟目录名称
获取请求头信息
getHeader(name)方法 --- String 
getHeaders(String name)方法 --- Enumeration<String>
getHeaderNames方法 --- Enumeration<String>
getIntHeader(name)方法  --- int
getDateHeader(name)方法 --- long(日期对应毫秒)
请求参数信息
getParameter(name) --- String 通过name获得值
getParameterValues  --- String[ ] 通过name获得多值 checkbox
getParameterNames  --- Enumeration<String> 获得所有name
getParameterMap  --- Map<String,String[ ]> key :name value: 多值


请求参数的乱码原理及解决:
浏览器用什么码表打开表单就用什么码表提交请求参数。所以我们可以通过控制浏览器打开表单页面时的码表来控制浏览器提交请求参数时的码表。
而服务器如果不指定默认用iso8859-1来解码请求参数,而iso8859-1中没有中文,从而产生乱码。
解决方法:
如果是POST提交,可以在获取请求参数之前执行request.setCharacterEncoding("xxx");解决乱码。注意这行代码必须写在获取任何请求参数之前,如果这行代码之前        获取过任何请求参数则这行代码无效。
这种方式只对请求的实体内容起作用,所以对GET提交的请求参数无效。
对于GET提交的请求参数,可以手动的编解码来解决乱码。
username = new String(username.getBytes("iso8859-1"),"utf-8");
这种方法从原理上解决乱码,对于GET和POST提交均有效。


路径难题:
在web程序中,当我们需要读取资源文件时,发现,如果写相对路径就到程序的启动目录 tomcat/bin 下找资源了,如果写绝对路径 就到 tomcat所在的根目录下找资源,如     果写盘符开始的路径可以找到资源,但是一旦换了一个发布环境这个路径很可能是错的。


七、ServletContext
代表当前web应用
当服务器启动,web应用加载完成后,立即创建一个ServletContext对象代表当前web应用。从此驻留在内存中唯一的代表当前web应用。直到服务器关闭或web应用移除出容器时,   随着web应用的销毁而销毁。

1.获取ServletContext
servletConfig.getServletContext();
this.getServletContext();
2.加载资源文件
路径难题

ServletContext.getRealPath("xxxxx");//会在传入的路径前拼接上当前web应用的硬盘路径。


~另外在没有ServletContext的环境下,我们可以使用类加载器加载资源。但是要注意,类加载器加载资源时,路径要相对于平常加载类的位置进行计算。
ClassLoader.getResource().getPath();
ClassLoader.getResourceAsStream();
3.读取web应用的初始化参数
我们可以在web.xml的根目录下为整个web应用配置一些初始化参数。
<Context-param>
可以通过ServletContext对象来读取这些整个web应用的初始化参数。
servletContext.getInitParamter();
servletContext.getInitParamterNames();


4.作为域对象使用
域:一个对象具有了一个可以被看见的范围,那么利用这个对象身上的Map,可以在这个范围内共享数据,这样的对象叫做域对象。
javaweb中一共有四大作用域,其中ServletContext就是其中最大的一个。


setAttribute(String name,Object value);
getAttribute(String name);
removeAttribute(String name);
getAttributeNames();


ServletContext域的
作用范围:
在整个web应用中共享数据
生命周期:
服务器启动web应用加载ServletContext创建,直到服务器关闭或web应用移除出容器时随着web应用的销毁,ServletContext销毁。
主要的作用:
在整个web应用中共享数据。




paramter -- 请求参数
initparamter -- 初始化参数
attribute -- 域属性
八、Response
1.Response的继承结构
ServletResponse -- 最基本的响应对象,只有最近本响应应该具有的方法
|
|--HttpServletResponse -- 在ServletResponse的基础上增加了很多和Http协议相关的方法。
2.常用方法
设置状态码:
setStatus(int sc)
setStatus(int sc, String sm)
设置相应头:
setIntHeader(String name, int value)
setHeader(String name, String value)
setDateHeader(String name, long date)
设置实体内容:
PrintWriter getWriter()
ServletOutputStream getOutputStream();


3.输出数据到客户端
getOutputStream 输出数据产生乱码,时因为服务器发送数据时采用的编码和浏览器打开时采用的编码不一致造成的。(浏览器默认用平台码打开)。可以通过设置Content-    Type相应头通知浏览器用指定编码打开数据,解决乱码问题。
getWriter 如果不指定编码服务器用默认的iso8859-1将字符转换为字节,在服务器端就产生乱码。可以通过response.setCharacterEncoding()来指定服务器用什么编码将   字符转换为字节,从而解决这种乱码,同时也要保证通过设置Content-Type头来通知浏览器用对应码表打开,就没有乱码
response.setContentType(),即会通知浏览器打开用的编码,也会通知服务器用什么编码发送,一行代码搞定响应乱码。


response输出数据时的细节问题:
getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。
getOutputStream和getWriter获取的流服务器会帮我们关闭,不需要我们手动关闭。


4.禁止缓存
response.setDateHeader("Expires", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
九、资源跳转的三种方式
1.定时刷新
原理:refresh头

response.getWriter().write("恭喜您注册成功,3后后回到主页。。。");
response.setHeader("refresh", "3;url="+request.getContextPath()+"/index.html");


2.重定向
原理:302+Location


        方式一:
 response.setStatus(302);
 response.setHeader("Location", "/Day06/index.jsp");
        方式二:
 response.sendRedirect("http://www.baidu.com");


两次请求两次响应
地址栏发生变化
可以跨站点进行资源跳转


3.请求转发
原理:服务器内部的资源跳转
request.getRequestDispatcher("xxxx").forward(request,response);


只有一次请求一次响应,对于浏览器来说它不知道也不关心所获得的响应是否经过请求转发。
地址栏不发生变化
不可以跨站点进行资源跳转,只能时当前web应用内部才可以。


注意事项:
转发类似于方法调用,转发之后的代码在转发执行结束后仍然会执行。


链式转发允许1->2->3->。。。
转发不能形成环 1->2->3->1
一个Serlvet不允许多次转发 1->2
1->3


转发前,如果已经由数据写入了响应的实体内容,则在转发时首先清空这些内容。
转发前,如果已经有数据被打给了浏览器,则转发不成功。


4.利用Request域在请求转发时传递参数
Request是一个域对象
setAttribute
getAttribute
removeAttribute
getAttributeNames


作用范围:
在整个请求链上都可以操作
生命周期:
一次请求开始创建出request对象,一次响应结束request对象被销毁,在这个期间request域存活。
主要作用:
在请求转发时在整个请求链上传递信息。


5.请求包含
请求包含可以将多个资源的输出合并为一个输出。
request.getRequestDispatcher("xxx").include(request,response);


注意:被包含的Servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的执行结果将被忽略

6.重定向和转发的比较
请求重定向:两次请求两次响应 地址栏会发生变化 可以跨站点进行资源的跳转 两个request 
请求转发:一次请求一次响应 地址栏不会发生变化 不可以夸站点进行资源跳转 一个request


如果在资源跳转的时候,希望通过request域传递数据,必须用请求转发
如果想要在资源跳转时,改变地址栏,必须用请求重定向。
如果是要跨站点资源跳转必须用请求重定向。
如果想要更新刷新操作,必须用请求重定向。


如果转发和重定向都可以的情况下,优先用请求转发,可以减少访问服务器的次数,减轻服务器的压力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值