tomcat项目部署方式:
1、直接在tomcat中的webapps下部署项目
2、在tomcat的server.xml中的的<Host>标签中加入
<Context path="/访问路径" docBase="绝对路径到/WebRoot" reloadable="true"/>
注:tomcat启动异常正常都是配置文件造成的,在启动tomcat时,应看一下是否报有异常。如果tomcat异常,会造成项目无法正常加载。
Servlet生命周期:
1、载入:第一次请求的时候被初始化,只一遍
2、初始化:调用init方法,只一遍
3、执行:没一个请求,new一个新的线程,调用一遍service->super.service->doGet/doPost
① 不要在Servlet中设计成员变量(多个请求线程共享,会发生资源冲突问题。正常即使设也是只读,不可写的即final)
② doGet,doPost常见异常
③ HTTP Status 405 - HTTP method POST(GET) is not supported by this URL;增加doPost()或者doGet()方法即可
4、销毁:卸载前调用destroy方法,子类Servlet一般不需要覆盖这个方法
注:在非分布的情况下,通常一个Servlet在服务器中有一个实例。(tomcat是单实例多线程)
Servlet的Mapping的路径是为了客户端访问,如果Servlet仅用于项目资源加载,可不写URL
web.xml详解:
Web项目和tomcat的web.xml的关系?
有效范围区别:一个仅限自己项目,一个是服务器上所有项目
缓存:
问题:当修改完自己代码后,进行访问,页面没有改变,一般有以下两种情况:
① 客户端浏览器缓存(解决办法:在浏览器中直接点击刷新即可)
② 服务器缓存 (在IDE中刷新,服务器重新部署,删除所有tomcat中JSP文件,重新加载)
HttpServletRequest对象:
服务器将客户端请求的信息封装在request对象中。
① 请求行
② 请求头
③ 实体内容
HttpServletResponse对象:
服务器端的响应信息被封装在这个对象中
响应信息由response对象传送给web服务器,在由web服务器发送给客户端
构建响应信息:
① 构建响应头:
response.setHeader("content-type","text/html;charset=gbk");
response.addHeader("refresh","3;url=1.jsp");
② 构建响应体:
response.getWriter() //输出文本使用
response.getOutputStream() //输出非文本使用(比如:下载)
注:Servlet中两次获取的getWriter的流为同一个流(应该采用的是单例模式)
text/html HTML数据
text/xml XML数据
text/plain 普通文本数据
请求转发与重定向:
重定向:相当于在请求头中加入相关信息,后面的代码依旧执行,可以存在多个服务器,但是不能传递request对象。地址会发生变化
请求转发:多个Servlet之间属于同于个请求,但是只能局限于本服务器,地址不会发生变化
Path“/”总结:
① 只要是需要通过浏览器发送请求的地方(比如HTML代码,sendRedirect方法等),“/”一般代表虚拟主机根目录,相当于端口号之后的“/”。
② 服务器程序内部跳转,“/”一般代表本web应用根目录。
保存状态的两种方式:
① Session:(服务器端)
适合保存大量的数据
安全
效率高
Session跟踪机制中需要cookie来保存和传递sessionId
② Cookie:(客户端)
不适合保存大量信息
不安全
效率低
Session基本用法以及作用域:
1、将http状态信息保存在服务器端的技术
2、取得:
HttpSession session = request.getSession();
如果session已经被创建,则返回已经创建的。如果未创建,则创建新的session。一个客户端拥有一个session对象。
3、作用域:被属于同一个会话的请求共享。
4、其他方法:
session.getId() 返回相关联的session的id。
session.setMaxInactiveInterval(6) 以秒为单位设置session的最大空闲时间(也可以在web.xnk中<session-config>中配置空闲时间,在tomcat的web.xml中的也会有配置,默认是30分钟)。
session.invalidate() 强制session失效。
Cookie:
1、将http状态信息保存在客户端的技术
2、不是服务器直接读取本地的cookie,是浏览器读cookie,而服务器读浏览器发出的名为cookie的请求头信息。
3、取得:
Cookie cookie = new Cookie("name","value");
添加多对值,要new多个cookie。
4、方法:
cookie.setMaxAge(3600*24) 设置cookie的有效期。如果不设置cookie有效期,cookie就不会被增加到客户端硬盘上,只能写在客户端的内存中。
5、响应信息中添加cookie:
response.addCookie(cookie);
6、取得客户端发来的cookie:
request.getCookie();
返回Cookie[]类型的数组,再调用getName() getValue()来访问 他的name和value读取的不是客户端硬盘和内存中的信息,而是浏览器发送给服务器请求头Cookie中的信息。
ServletConfig:
一般用于处理该Servlet在配置文件配置的信息
1、标记里氏参数名和参数值,要写多对参数,就要用多个<init-param>标记
2、取得:
ServletConfig sc = this.getServletConfig();
3、方法:
sc.getInitParameter("aaa") -> 返回名为aaa的参数值
sc.getServletName() -> 取得所属Servlet的名字
sc.getInitParameterNames() -> 返回所有参数名的枚举
ServletContext:
一个web应用只有一个ServletContext对象。所有的Servlet都共享这个ServletContext对象,又称为Application对象,也是一个作用域:
空间:最广,被所有Servlet共享
时间:最长,从web应用被加载到被卸载都有效
常用方法:
读取web.xml中<context-param>参数
作用域:setAttribute/getAttribute/removeAttribute
用于获取文件绝对路径:getRealPath("1.jsp");
用于获取目录下的所有目录和文件的路径,返回Set类型
getResourcePath("/picture");
用于获得web应用中的资源:
getResourceAsStream("/1.properties");