申明:本笔记参考视频《尚学堂Servlet笔记》
一、 配置
1、 运行Tomcat需要配置环境变量JAVA_HOME
2、 更改端口,conf/server.xml 中Connector port
3、 当项目(Web-Info)发生变化时使Tomcat自动加载,conf/context.xml中的Context中加上属性,reloadable =”true”
4、 相对路径:不是以http://或者/开头的路径。对于绝对路径,在html中/代表的是http://localhost:8080/,而Servlet配置文件中,/代表http://localhost:8080/app/ .
5、 删除使用相同端口的进程
netstart –a 查处端口号是否被使用
netstart –o 查找端口好对应的线程号
在进程管理器中将对应的进程杀死
二、 Servlet的乱码解决
1、 向前台写中文,需要在getWriter()前调用resp.setContentType(“text/html;charset=GBK”);或者调用resq.setEncoding(“GBK”);
2、 对于post方式,需要从前台获取中文,需要调用req的setEncoding()方法。
3、 对于get方式,需要在server.xml的Connector中加入属性,URIEncoding=”GBK”。
4、 向浏览器的地址栏中写入中文,需要转码,如userName=URLEncoder(username, ”GB18030”);
乱码场合:
1、 默认情况下(什么都不写),通过get方式(get表单和链接),中文乱码,通过form方式,能得到中文。
2、 加上<%@ page contentType=”text/html;charset=GBK”%>,post方式得到乱码,get方式得到中文。
如果在servlet中,则加入resp.setContentType(“text/html;charset=gbk”)
3、 在加上request.setCharacterEncoding(“gbk”)都能得到中文。
4、 对于场合,<jsp:param name=”user” vlue=”<%=s%>”>,url地址中包含中文参数,解决办法为<%request.setCharacterEncoding(“gbk”)%>
三、 Servlet生命周期
1、 加载
加载时间有以下三种情况:
(1) 如果某个Servelt配置了自动载入选项,则在启动服务器时自动载入
(2) 如果没有,则在服务器启动后,客户机首次向Servlet发出请求时
(3) 重新加载Servlet时
2、 实例化
客户机第一次想Servlet发出请求时实例化相应的Servlet。
3、 init
实例化之后,自动调用init方法。
4、 service(doGet、doPost)
以多线程的方式来调用service方法,客户端没发出一个请求,容器则为其分配一个限制的线程来调用service方法,由service方法根据请求的方式来调用doGet和doPost方法。因为是以多线程的范式访问,所以最好不要在servlet中设置成员变量。
5、 destroy
关闭web应用程序、或者重新加载Servlet时,调用destroy方法。
四、 获取Servlet中参数的方法
1、 在Servlet中设置参数
<servlet>
<servlet-name></ servlet-name >
<servlet-class></ servlet-class >
<init-parameter>
<param-name>name</param-name>
<param-value>小王</param-value>
<param-name>name</param-name>
<param-value>小王</param-value>
</init-parameter>
</servlet>
2、 根据param-name获取某个参数
String name=this.getServletConfig().getInitParameter(“name”);
如果web.xml的编码方式为ios8859-1,则可以手工将其转化为gbk
name=new String(s.getBytes(“ios8859-1”,”GBK”));
3、 获取Servlet相关信息
String servletName=this.getServletConfig().getServeltName();
4、 获取Servlet所有Init参数
Enumeration parames=this.getServletConfig().getInitParameters();
while(parames.hasMoreElements()){
String name=parames.nextElement().toString();
…
}
五、 GenericServlet类的两个Init方法
1、 init(ServletConfig( config)
init()
2、 Tomcat调用的是第一个init方法,在第一个init方法中,初始化config,然后再调用第二个init方法。所以重载父类的init方法是,最佳方法是重载第二个init方法。如果重在第一个init方法,则需要调用父类的第一个init方法,以初始化config。
六、 获取参数
1、 对于只有一个值的form元素,可以使用req.getParameter(“name”)方法获取参数
2、 可以通过req.getParameterNames()方法获取所有form表单中的名字,返回类型为Enumeration。
3、 如果有多个相同名字的form元素,可以通过方法req.getParameterVales(“name”)获取,返回类型为String[]。
4、 通过方法request.getParameterMap()方法可以获取form元素的名称和其值的map。
七、 cookie
1、 Cookie分为两种,一种属于窗口/子窗口(放在内存中),另一种属于文本(有生命周期)
2、 一个servlet/jsp设置的cookies能够被同一个路径(url)下面或者子路径下面的servlet/jsp读到,反之则不能。
3、 添加一个cookie
Cookie cookie=newCookie(cookieName,cookieValue);
response.add(cookie);
4、 得到cookie
Cookie[] cookies=request.getCookies();
5、
八、 session
1、 session常见的两种实现方式:
1) 通过在客户端的cookie中加入sessionID实现session
2) 通过url重写实现session
response.encodeUTL(request.getRequestURL.toString());
2、 在servlet中得到session
req.getSession(true);其中true表示,如果没有session实例,则创建一个。
3、 配置session的生命周期
conf/web.xml中的session的子标签session-timeout
4、
九、 application
在Servlet中对应的类为ServletContext。
十、 cookie和session的区别
1、 cookie存储在客户端,session存储在服务器端。
2、 cookie有两种类型,而session有两种实现方式。
3、 父路径下不能访问子路径的cookie,而同一个session的窗口共享一个session。