Servlet总结
1. Serlvet是一个特殊的类 继承了httpServlet的一个类
2. 每个servlet都要在web-inf/web.xml文件中配置相应的信息
<servlet>
<servlet-name>first</servlet-name>
<servlet-class>com.puckasoft.servlet.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>first</servlet-name>
<url-pattern>/firstServlet</url-pattern>
</servlet-mapping>
其中servlet-mapping中的url-pattern对应的属性是指浏览器访问的url 必须要加上/,这个/代表浏览器访问该项目的根目录 firstServlet这个url是通过浏览器来访问该serlvet这个类的方式 其中servlet-name起到桥梁的作用 让浏览器通过url可以找到对应的class
注意:(1)url-pattern必须加上/
(2)每个servlet-name在web.xml文件中是唯一的 所以建议这个名字起成和对应的类名一样
(3)sevlet-class的对应的类的路径一定要确认无误
3. Servlet是一种可以在Servlet容器中运行的组件,那么理所当然就应该有一个从创建到销毁的过程,这个过程我们可以称之为Servlet生命周期。Servlet的生命周期可以分为加载、实例化、初始化、处理客户请求和卸载五个阶段,体现在方法上主要是init()、service()和destroy()三个方法。生命周期的具体说明如下:(1)Servlet容器完成加载Servlet类和实例化一个Servlet对象init()方法完成初始化工作,(2)该方法由Servlet容器调用完成service()方法处理客户端请求,并返回响应结果(3)destroy()方法在Servlet容器卸载Servlet之前被调用,释放一些资源
4. 加载并初始化Servlet在前面已经说过Servlet容器完成加载和实例化Servlet的工作,该工作既可以在容器启动时完成,也可以在容器收到请求时完成,或者是两者之间的某个时间启动。之后需要初始化Servlet,即读取配置信息、读取初始化参数等,这些基本上在整个生命周期中只需要执行一次。关于init()方法已经在积累GenericServlet中提供缺省实现,如果不需特殊处理规则没有必要再进行定义,否则要重写。
5. httpservletRequest对象保存了了客户端的信息
以下是获取请求的基本信息
getMethod方法返回客户端请求方式
getRequestURI返回端口后参数之前那部分内容, 且为真实的资源名,而不一定与地址栏中相同
getQueryString 返回资源路径?号后面的所有内容
getScheme返回协议名称。
getContextPath返回请求url所属的web应用程序的路径
getRequestURL返回真实的资源路径,不一定与地址栏相同,但不包括参数部分,且返回类型StringBuffer
getRemoteAddr 返回客户端的ip地址
getRemotePort 返回客户端的发出请求使用的端口
getLocalAddr 返回服务器上接受当前请求的网络接口的ip地址
getLocalPort 返回服务器上接受当前请求的网络接口的端口号
以下是获取请求头信息
getHeader(headName)方法(该方法是通过headName的属性名取获取值 如忘记headName的属性名 可以用getHeaderNames()方法
获取所有的属性名再选择有用的)
注意:(1)referer属性: 包含一个URL,用户从该URL代表的页面出发访问当前请求的页面(即保存上次访问的路径url)
(2)accept-language属性:返回的是用户的语言类型 实例见google
(3)User-Agent属性:返回的是用户的浏览器版本信息
以下是获取请求的参数
Request.getParamter(“name属性”)
通过name属性值来获取该属性对应的value值
注意通常情况下如果为文本形式要加上.trim()去掉首尾的空格 但一定要注意name属性值一定要正确 否则会出现nullpointException的异常
并且如果不是文本框形式 比如说如果是单选按钮 这里不要加.trim()
Request.getParameterValues()获取的复选框的value值
6个重要对象
ServletConfig:用于处理在配置文件web.xml中,每个servlet初始化的参数。
<servlet> <servlet-name>dwr-invoker</servlet-name> <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> </servlet> |
取得:ServletConfig sc = this.getServletConfig();
方法:sc.getInitParameter("aaa")à返回名为aaa的参数的值
Sc.getServletName()à取得所属servlet的名字
sc.getInitParameterNames()à返回所有参数名的枚举
Enumeration e = sc.getInitParameterNames(); while(e.hasMoreElements()){ String paramName = (String) e.nextElement(); System.out.println(paramName+"----"+sc.getInitParameter(paramName)); } |
ServletContext: 所有的servlet都共享同一个ServketContext对象,又称为Application对象。在web.xml中可以声明“全局参数”。
<context-param> <param-name>ccc</param-name> <param-value>CCC</param-value> </context-param> <context-param> <param-name>ddd</param-name> <param-value>DDD</param-value> </context-param> |
取得:ServletContext context = this.getServletContext();
方法:context. getInitParameter(“aaa”)和context. getInitParameterNames()和ServletConfig的类似。
context.setAttribute(“a”,”AAA”)设置属性。
context.getAttribute(“a”)取得属性。
context.removeAttribute(“a”)删除属性。
context.getRealPath(“1.jsp”)用于获取文件绝对路径。
context.getResoursePaths(“/picture”)用于获取目录下的所有目录和文件的路径,返回Set类型。
context.getResourceAsStream("/1.properties")用于装载资源文件
读取 InputStream is = context.getResourceAsStream("/1.properties"); Properties p = new Properties(); p.load(is); resp.getWriter().println(p.getProperty("name")); is.close(); |
1.properties |
name=gjw sex=male |
修改 FileOutputStream fos = new FileOutputStream(new File(context.getRealPath("/1.properties"))); p.setProperty("sex", "famale"); p.store(fos, null); fos.close(); |
HttpServletRequest::客户端的请求信息被封装在这个对象中。
获取请求基本信息
request.getMethod() |
GET |
请求方式 |
request.getRequestURI() |
/jsp/ReqTest |
端口到?之间 |
request.getQueryString() |
uname=gjw |
?后 |
request.getScheme() |
http |
协议 |
request.getContextPath() |
/jsp |
Web应用目录 |
request.getRequestURL() |
http://localhost/jsp/ReqTest |
除了?后的 |
获取网络连接信息
request.getRemoteAddr() |
客户端IP |
request.getRemotePort() |
客户端端口 |
request.getLocalAddr() |
服务器端IP |
request.getLocalPort() |
服务器端端口 |
获取请求头信息
request.getHeader(“content-length”)和request.getHeaderNames()与ServletConfig的操作相似。
request.getContentType()和request.getContentLength()在请求方式为Post时才有用,上下文的类型和参数长度,他们和上面的getHeader功能一样,只不过因为常用才特意声明为方法。
获取请求参数
String |
getParameter(“uname”) |
得到表单域的值 |
String[] |
getParameterValues(“aihao”) |
复选框的值 |
Enumeration |
getParameterNames() |
|
利用请求域属性传值
request.setAttribute(“a”,”AAA”) |
设置属性 |
request.getAttribute(“a”) |
取得属性 |
request.removeAttribute(“a”) |
删除属性 |
request.getAttributeNames() |
返回枚举,对所有属性遍历处理 |
HttpServletResponse:服务器端的响应信息被封装在这个类中。
构建响应头消息
addHeader(name,value)响应头是消息可写。
三种设置编码的方式
response.setContentType("text/html;charset=gbk");
response.setHeader("content-type", "text/html;charset=gbk");
response.setCharacterEncoding("gbk");
response.addHeader("refresh", "3;url=1.jsp");
响应头的设置应在得到输出流(即: response.gerWriter())之前设置,否则无效。
response.getWriter().println, print, write三个方法的区别:
1. write方法遇到Null时抛出空指针异常。 print,println则直接打印null
2. 换行指的是html源码换行,并不是页面显示时换行。
请求重定向和请求转发: 不论用什么跳转,之后的语句还是会被执行,一般在之后加上return;
请求重定向response.sendRedirect(URL);
1. 地址栏改变,可以访问本web应用以外的资源。
2. 整个过程发送两次请求。
3. 不加/是相对本servlet所在目录,加/表示端口号后面的根目录http://localhost:8080/
4. sendRedirect后面语句仍然会被执行,所以一般加return .
请求转发request.getRequestDispatcher("LoginPage").forward(request, response);
1. 地址栏不改变,只能访问自己web应用的资源。
2. 整个过程是一次请求。
3. 不加/是相对本servlet,加/表示web应用的根目录http://localhost:8080/jsp/
4. 还可以this.getServletContext().getRequestDispatcher("/1.jsp").forward(request, response);
5. 请求转发之后的语句仍然会被执行。所以,一般在该语句执行之后加return.
6. 由于多个servlet之间属于同一个请求,共享同一个request对象,所以可以通过request作用域来共享传递一些信息。
过程示例:
HttpSession:将http状态信息保存在服务器端的技术。
取得:HttpSession session = request.getSession();
方法:session.getId() 返回相关联的session的id。
session.setMaxInactiveInterval(6) 以秒为单位设置session的最大空闲时间,可以在web.xml中<session-config>中配置空闲时间。
session.invalidate() 强制session失效。
利用属性设置来传递参数,与request的操作一样。
Session空闲时间的设置:
1. setMaxInactiveInterval(7) ; 设置7秒后过期
2. 通过web.xml中的配置:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
3. invalidate() ; 使当前session对象强制失效。
Session作为作用域保存传递信息。