Servlet知识总结

Other
HungrySingleton:饿汉模式
优点:虚拟主机初始化时创建对象,只创建一个对象
缺点:虚拟机会加载一些不常用的对象,浪费内存
LazySingleton:懒汉模式
优点:第一次访问时创建对象
缺点:代码复杂

多线程:多线程可以大大的提高用户的访问速度。
tomcat服务器是多线程的,每次请求的时候服务器就会创建一个新的线程,
线程之间是相互独立的,客户间也是相互独立的,互不干扰的。

servlet:
单例多线程 (目的,共享一个servlet对象)
1、单例模式:饿汉式 懒汉式
2、servlet借鉴了懒汉式单例模式
3、servlet的生命周期(面试常问)
1.加载(创建servlet对象的过程)
2.初始化 只调用一次
调用init()方法
3.执行servlet任务
调用service()方法 可以调用n次
注意:避免405错误的产生
1.重写servcie方法并去掉==》super.service(req, resp);

2.重写doPost和doGet方法并去掉==》super.doGet(req, resp);和super.doPost(req, resp);

成员变量
1.将成员变量替换成局部变量、
2.将成员变量设置只读常量
4.销毁
服务器关闭的时候
调用destroy()方法
如果服务器内存溢出的时候,会首先销毁最近不被频繁调用的servlet对象

servlet方法总结:
1.service():执行任务
2.doget():用于处理get方式的请求
3.dopost():用于处理post方式的请求
4.init():servlet对象创建的时候调用的初始化方法
5.destroy() :servlet对象销毁的时候调用的 ??如何使用

为了解决创建servlet对象时间比较长的servlet,
我们可以通过
<load-on-startup>--将servlet懒汉式转换为饿汉式
<load-on-startup>X<0</load-on-startup>:servlet还是懒汉式
<load-on-startup>X>0</load-on-startup>:servlet是饿汉式,值的大小代表创建servlet对象的顺序

注意名字的写法:一般保证不要跟其他servlet重复,一旦重复,会被覆盖(从上到下)
注意url的写法,保证在web.xml中唯一,不能重复

 

乱码处理
处理请求端的乱码
处理post乱码
req.setCharacterEncoding("utf-8");//注意,放在第一行


处理响应端的乱码
resp.setCharacterEncoding("utf-8");//设置响应的编码格式
resp.setHeader("content-type", "text/html;charset=utf-8");//第一种:告诉浏览器该怎么解析
resp.setContentType("text/html;charset=utf-8");//第二种:告诉浏览器该怎么解析


Config知识:
获取config信息
ServletConfig servletConfig = this.getServletConfig();

打印config信息中的名字
System.out.println(servletConfig.getServletName());

获取名字为Sclass的config信息
System.out.println(servletConfig.getInitParameter("Sclass"));

获取名字为Sgrade的config信息
System.out.println(servletConfig.getInitParameter("Sgrade"));
web.xml设置格式
<init-param>
<description>描述信息</description>
<param-name>Sclass</param-name>
<param-value>506</param-value>
</init-param>
注意:写在<servlet-class>后面,</servlet>前面,属于局部参数


Context知识:
获取Context
ServletContext c1 = this.getServletContext();
ServletContext c2 = this.getServletConfig().getServletContext();
ServletContext c3 = req.getSession().getServletContext();

System.out.println(c1 == c2);
System.out.println(c2 == c3);
System.out.println(c1.hashCode() + "----" + c2.hashCode() + "----"
+ c3.hashCode());

获取Web项目绝对路径
System.out.println("web项目绝对路径:" + c1.getRealPath(""));
System.out.println("web项目绝对路径:" + c2.getRealPath("/"));
System.out.println("web项目绝对路径:" + c3.getRealPath("/upload"));

获取src下的文件信息
System.out.println("src下的文件:"
+ LearnServletContext.class.getClassLoader()
.getResourceAsStream("DBUtil.properties"));
System.out.println("src下的文件:"
+ Thread.currentThread().getContextClassLoader()
.getResourceAsStream("DBUtil.properties"));

获取WebRoot目录下的文件信息
System.out.println("WebRoot目录下的文件:"
+ c1.getResourceAsStream("index.jsp"));

web.xml文件设置
<context-param>
<description>全局参数信息描述</description>
<param-name>schoolmaster</param-name>
<param-value>LIYI</param-value>
</context-param>
注意:写在<servlet></servlet>前面,属于全局参数


Cookie:(依赖于客户端)
在Servlet中cookie对象
创建cookie
Cookie c1 = new Cookie("clothes", "AA");
Cookie c2 = new Cookie("shose", "BB");
Cookie c3 = new Cookie("jeans", "CC");

设置cookie存活时间[毫秒为单位]
c1.setMaxAge(3600 * 24 * 3);

设置cookie动态访问方式
req.getContextPath:项目的部署名 http:localhost:8080/req.getContextPath()
c2.setPath(req.getContextPath() + "/car");

将cookie加入到响应结果中
resp.addCookie(c1);
resp.addCookie(c2);
resp.addCookie(c3);

用于向客户端返回少量的信息

 

获取Cookie
方法一, 推荐此方法
Cookie[] cookies = req.getCookies();

for (int i = 0; i < cookies.length; i++) {
System.out.println(cookies[i].getName() + "----"
+ cookies[i].getValue());
}


方法二
String cookiestr = req.getHeader("Cookie");
System.out.println(cookiestr);

 

session:(依赖于服务器端 ---会话)
1.创建会话
HttpSession session = req.getSession();
2.设置会话不活动周期
session.setMaxInactiveInterval(10);
3.立即销毁会话
session.invalidate();
4.打印会话标示
System.out.println("Session的ID:" + session.getId());
5.存值
setAttribute("","")

session定义一次会话的跟踪机制与cookie有关
加入浏览器管理,会话依然会销毁
全局tomcat-->conf-->web.xml的session-timeout ---默认30分钟
当前的web.xml重写session-timeout ---N分钟
往具体web项目中的具体Servlet资源设置了会话HttpSession对象的不活动周期时间
就会按照这个时间计算,一旦超过会话时间,会话结束


三大作用域
request session application
作用域的目的:数据传递 【存值的过程(setAttribute("","")) 取值的过程getAttribute(""),销毁值的过程removeAttribute("")】

生命周期
requset:一次请求
session:一次会话(多次请求)
application:项目的加载到卸载
作用范围
requset:所有被请求转发的servlet
session:所有的servlet
application:所有的servlet(换一个浏览器演示请求,跟session区分开)
如何正确的选择作用域
requset:跟当前操作相关
session:跟用户信息相关
application:存储项目的全局信息

如何正确的选择作用域不正确,会出现什么情况?
  内存浪费


req.
||
获取IP地址:getRemoteAddr
获取前台数据:getParameter
获取请求头:getHeader
获取请求头名字:getHeaderNames

请求行:
||
请求方式:req.getMethod()
协议:req.getScheme()
协议版本号:req.getProtocol()
请求资源URL:req.getRequestURL()
请求资源URI:req.getRequestURI()
get请求方式获取到的参数:req.getQueryString()
项目的部署名:req.getContextPath()
客户端:req.getRemoteAddr() +"==="+req.getRemotePort()
服务器端:req.getLocalAddr()+"==="+req.getLocalPort()

请求转发
||
getRequestDispatcher("dispatcher.jsp").forward(req, resp);

切记,请求转发不能访问外网
getRequestDispatcher("http://www.baidu.com").forward(req, resp);

第一次转发完毕之后不可再继续转发,要用return返回,否则有错


resp.
||
getWriter().print()写入网页页面

设置响应头
||
setHeader(name,value)----name不可重复,后面覆盖前面的
addHeader(name,value)----name可重复

重定向
||
sendRedirect("redirect2.action?music="+music);
能访问外网
resp.sendRedirect("http://www.baidu.com");
第一次转发完毕之后不可再继续转发,要用return返回,否则有错

 

posted @ 2016-10-20 20:28  IT蓄水池  阅读(146)  评论(0)    收藏  举报