-
3):<url-patternt>必须保证唯一性,而且必须使用/打头.
4):Servlet的映射支持通配符映射(*:表示任意字符):
第一种写法: /*, 任意的资源都可以访问该Servlet. 比: /m1 /m2
/system/*:请求的资源必须以/system/打头才可以访问.
/system/m1 可以进入
/m1 不可以进入
Servlet中,权限控制.
第二种写法: *.拓展名, 比如: *.do, 请求的资源必须以 .do 作为结尾才可以访问该Servlet.
比如:
/xxx.do 可以进来
/xxxx 进不来隐藏资源请求是什么系统开发的.
-
5):在映射Servlet的时候,<servlet-name>元素的文本内容不能是default.
因为,在Tomcat中存在一个叫做default的Servlet,专门用于处理请求静态资源(html,css,js,图片等).
在Tomcat根/conf/web.xml文件:若配置成default,则不能处理静态资源了6):配置项目的默认首页
Tomcat根/conf/web.xml 最后几行<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list> -
从Tomcat7开始,可以使用注解(WebServlet)来取代XML配置.
使用注意:在web.xml文件的根元素中,存在属性,表示是否忽略扫描Web组件注解:
metadata-complete="true" : 要忽略
metadata-complete="false": 不忽略, 表示要进行注解扫描, 表示注解能生效
不要改属性: 缺省情况等价于metadata-complete="false".回顾Servlet生命周期方法的执行流程:
在启动Tomcat服务器的时候,没有对Servlet创建和初始化操作.
在第一次服务端请求的时候才对Servlet创建和初始化操作. -
Servlet,要在服务器启动的时候,就创建好对象,并做好初始化操作.
-
@WebServlet(loadOnStartup=1,initParams={
@WebInitParam(name="encoding",value="utf-8")
},value="/cat") //urlPatterns="/dog" 也可以作为资源路径
public class ServletTest implements Servlet{...}比如:在SpringMVC中的DispatchServlet就是用来处理所有请求的,就应该在服务器启动的时候,就初始化.
-
Servlet的线程不安全问题:
造成的根本原因是:Servlet是单例的,Servlet中的非static的成员变量只有一份,多个客户端好比是多个线程,都访问的是同一个空间.
解决方案:
1:让当前Servlet实现javax.servlet.SingleThreadModel接口.
该Servlet只能一个线程在执行,如果有多个线程就排队,如此的话,性能超低(已过时).
2:在Servlet中不要使用成员变量,使用局部变量.
每一个用户,每一个请求都会调用service方法,而局部变量在service方法中,每一次都是新的空间.
以后的dao service我们都定义成成员变量
Spring MVC是线程不安全的,处理请求的对象是单例的和Servlet类似.
Struts2是线程安全的,因为每一个请求都是一个新的Action对象.------------------------------------------------------------------------------------
HTTP协议特点:(无状态, 健忘)
一次会话:打开浏览器,访问某一个站点,多次请求,最后关闭浏览器,称之为一次会话.在一次会话中,多个请求之间无法共享数据,无法跟踪用户的会话信息.
解决方案一:
1):使用参数的传递机制.在每一个请求之间使用参数来传递需要共享的数据。http://localhost/day4/list?username=dafei
但是请求需要共享的数据 暴 露在浏览器的地址栏中Cookie:
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。1:创建一个cookie
//类比: map集, 以key-value对的形式存在
Cookie Cookie = new Cookie(String name, string value);
参数name: cookie 名称
参数value: cookie 值
注意: name 跟 value都是字符串类型
2:将cookie给浏览器
响应对象.addCookie(cookie);
3:接受请求中的cookie
Cookie[] cookies = req.getCookies(); //该站点所有的cookie
4:cookie不支持中文
注意:如果强制将中文设 给cookie会报错,除非添加cookie之前进行编码
编码后的值 = URLEncoder.encode(cookie中的value, "UTF-8")
在获得cookie时,进行解码
解码后的值 =URLDecoder.decode( cookie中的value, "UTF-8");5:修该cookie中的值
方式1:重新创建一个同名称的Cookie发给客户端覆盖原来的Cookie
Cookie c = new Cookie("currentName", "xiaofei");
方式2:在原Cookie对象的基础上调用setValue("newValue"),再发给客户端覆盖原Cookie
cookie.setValue("xiaofei");注意:要记得把新Cookie发给客户端覆盖原Cookie,比如:resp.addCookie(newCookie);
-
6: Cookie的分类(会话Cookie和持久化Cookie)
会话Cookie:该Cookie仅在当前这次会话中有效(浏览器关闭后,Cookie无效了)
持久Cookie:该Cookie在某段时间内有效(跟会话次数无关)
关键方法:cookie对象.setMaxAge(int seconds);
seconds > 0: 持久Cookie
seconds = 0: 删除该Cookie
seconds < 0: 会话Cookie
7:删除 cookie
cookie.setMaxAge(0);Cookie的缺陷,引出Session:
1):多个人使用同一台电脑的时候,可以查看浏览器的Cookie,不安全. Cookie:currentName=WCG2):Cookie存储中文比较麻烦(得编码,再解码).
3):Cookie的value是String类型,一个Cookie就只能存储一个数据,如果需要存储多个数据,就得写N个Cookie.
4):一个站点对Cookie有限制:
Cookie大小限制在4KB之内;
一台服务器在一个客户端最多保存20个Cookie;
一个浏览器最多可以保存300个Cookie;
5):在设计上就有问题,考虑生活中问题.
Cookie是浏览器和服务器之间数据交互的凭证,Cookie被人为删除了呢?
在生活中,我们是把识别数据存储到服务端. -
-------------------------------------------------------------------------
Session:
Session是服务器端技术,服务器为每一个用户的浏览器创建一个其独享的session对象,所以用户在访问服务器的web资源时,在服务器中可以把用户的数据放在各自的session中,当再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。Session其本质就是一个会话Cookie(浏览器关闭之后,Session就失效了)
1:Session的创建和获取
//获取当前客户端请求session,如果session存在, 则返回, 如果不存在, 创建一个
HttpSession session = req.getSession(true);
//获取当前客户端请求session,如果session存在, 则返回, 如果不存在, 不做操作
HttpSession session = req.getSession(false);
//等价于 req.getSession(true);
HttpSession session = req.getSession();(推荐)
2:使用Session存储数据
session.setAttribute(String name, Object value);
参数name: 存储数据的key值
参数value: 存储数据, 可以是任意类型3:获取session数据
1> 获取session对象
2> 调用session对象.getAttribute(存储数据的key值)
注意: 返回的是Object类型, 需要强转4:删除当前用户Session(用户注销登陆).
1):删除Session中指定属性名的值. 删除单个
session对象.removeAttrbute("currName");
2):销毁Session对象(Session中所有的属性都不存在). 删除多个
session对象.invalidate(); --> 运用场景: 注销
5.Session的超时管理
在一定时间之内,如果客户端和服务端没有交互(用户的两次操作之间不能超过该时间),
则自动的销毁Session.
session对象.setMaxInactiveInterval(60 * 10);//超过10分钟,销毁Session.
Tomcat服务器的默认超时时间为:30分钟,Tomcat一般在20多分钟就销毁了.SESSION 使用细节
1:一般的,我们存储到Session中的属性名称,要唯一,我们习惯 XXX_IN_SESSION:
session对象.setAttribute("USER_IN_SESSION","dafei");2:若需要把多个数据存放到Session中,就得调用setAttribute方法N次,可以的.
一般的,我们把需要存储的数据,封装成一个对象,然后在存储到Session中.
把用户的信息,封装到user对象.
session对象.setAttribute("USER_IN_SESSION",user对象);
3:如果多台服务器之间需要共享Session,此时Session中的对象,必须实现java.io.Serializable(才能在网络上传输). [集群]
序 列 化: 把对象信息存储为二进制.
反序列化: 把二进制信息恢复成对象.
public class User implements java.io.Serializable{....}4:URL重写.
Session是一种特殊的Cookie,而浏览器可以禁用Cookie.
此时,需要在每一个资源之后,手动的携带session的ID.
/session/list;jsessionid=ID,还是session.getId()?
String url = response.encodeURL("/session/list");自动的在资源之后拼接;jsessionid=ID注意:开发中都不会取消接受Cookie的.
-
javaweb-servlet 映射细节-cookie&session
最新推荐文章于 2022-09-16 20:32:30 发布