相对路径与绝对路径

相对路径:

链接地址  <a href="list.do"></a>

表单提交地址 <form action="add.do">

重定向 response.sendRedirect("list.jsp");

转发  request.getRequestDispatcher("listEmp.jsp");

(1)什么是相对路径?

不以"/"开头的路径。

(2)什么是绝对路径?

以"/"开头的路径。

(3)怎样写绝对路径?

链接地址、表单提交地址、重定向绝对路径应从应用名开始写,而转发应从应用名之后开始。

获得appname:String request.getContextPath()

如:

重定向——response.sendRedirect(/*重定向从应用名开始写*/

request.getContextPath()

+ "/app3/sub/some.jsp");

/*转发从应用名之后写*/

转发——request.getRequestDispatcher("/app3/sub/some.jsp")

.forward(request, response);*/

状态管理

(1)什么是状态管理

将客户端(浏览器)与服务器之间多次交互当作一个整体来看,并将多次交互所涉及的数据(状态)保存下来。

(2)如何进行状态管理

第一类方式:将状态保存在客户端(Cookie)

第二类方式: 将状态保存在服务器端(Session)

(3)cookie技术:

1) 什么是cookie?

a,cookie是一种客户端的状态管理技术

b,当浏览器向服务器发送请求时,服务器会将少量的数据以set-cookie消息头的方式发送给浏览器,

浏览器会将这些数据保存下来。当浏览器再次访问服务器时,会将这些数据以cookie消息头的方式发送给服务器。

2)如何创建一个cookie?

Cookie c = new Cookie(String name,String value);

response.addCookie(c);

3)cookie的查询

Cookie[] request.getCookies();

注意,该方法有可能返回null。

String cookie.getName();

String cookie.getValue();

4)cookie的生存时间

cookie.setMaxAge(int seconds);

注意:单位是秒

seconds >0 : 浏览器会将cookie保存在硬盘上,超过指定时间,会删除该cookie。

seconds < 0 : 缺省值,浏览器会将cookie保存在内存里,只要浏览器不关闭,cookie一直保存,当浏览器关闭,cookie会被清空。

seconds = 0 : 删除cookie

比如,要删除一个名叫userId的cookie:

Cookie c = new Cookie("userId","");

c.setMaxAge(0);

response.addCookie(c);

5)cookie的编码问题

cookie只能保存ascii字符,对于不合法的字符(比如中文)需进行编码,即转换成合法的ascii字符。

可使用URLEncoder.encode()方法和URLDecoder.decode()方法来进行这种转换。

6)cookie的路径问题

a,什么是cookie的路径问题?

浏览器在向服务器发送请求时,会比较cookie的路径与要访问的服务器的路径是否匹配,只有匹配的cookie才会发送给服务器。

b, cookie的默认路径

默认路径等于创建该cookie的组件的路径。

c,匹配规则

浏览器要访问的路径必须是cookie的路径或其子路径时,才会发送对应的cookie。

d, 设置cookie的路径cookie.setPath(String path);

比如  cookie.setPath("/web07");将cookie的路径一般设置为应用名,这样可保证该cookie可被该应用的其它组件都能访问到。

7) cookie的限制

a, cookie可被用户禁止。

b, cookie不安全,敏感数据,比如密码,帐号等等需加密。

c, cookie大小有限制,大约是4k左右(具体大小跟浏览器有关)。

d, cookie个数有限制,大约是300个(具体个数跟浏览器有关)。

e, cookie只能够保存字符串。

8)保存和查询Cookie流程

a. 浏览器向服务器发送addCookie请求

服务器中的AddCookieServlet创建了两个Cookie:cookie和cookie2

b. 服务器端执行语句response.addCookie(cookie);生成消息头“set-cookie”,

并将两个Cookie以键值对的方式(“name=aaa”、“passwd=123”)存放在消息头中发 送给浏览器

c. 浏览器将Cookie信息保存到本地内存中

d. 浏览器继续向服务器发送请求(带着消息头cookie)

服务器端的FindCookieServlet找到Cookie信息,并显示给浏览器

(4)session技术

1)什么是session?

a, session是一种服务器端的状态管理技术。

b, 当浏览器访问服务器时,服务器创建一个session对象(该对象有一个唯一的id号,称之为sessionId),服务器在默认情况下,会将sessionId以cookie的方式(set-cookie消息头)发送给浏览器,浏览器会将sessionId保存到内存。当浏览器再次访问服务器时,会将sessionId发送给服务器,服务器依据sessionId就可找到之前创建的session对象。

2)如何获得session对象?

方式一:

HttpSession s = request.getSession(boolean flag);

当flag=true时:服务器会先查看请求当中有没有sessionId,如没有,则创建一个session对象。如有,会依据sessionId查找对应session对象,如找到,则返回该session对象,如找不到,则创建一个新的session对象。

当flag = false时:服务器会先查看请求当中有没有sessionId,如没有,会返回null。如有,会依据sessionId查找对应session对象,如找到,则返回该session对象,如找不到,返回null。

方式二:

HttpSession s = request.getSession();

等价于 request.getSession(true)。

3)常用方法

String session.getId();

//obj类型最好实现Serializable接口,因为服务器在持久化session时,会使用java序列化协议。

session.setAttribute(String name,Object obj);

//如name对应的值不存在,返回null。

Object session.getAttribute(String name);

//解除绑定

session.removeAttribute(String name);

4)session超时

所谓session超时,指服务器会空闲时间过长的session对象从内存空间里删除掉。原因是,过多的session的对象会占用服务器过多的内存空间。大部分服务器都有一个缺省的超时限制,一般是30分钟。可修改服务器的缺省的超时限制。

如,可修改tomcat的web.xml配置文件(conf/web.xml)

<session-config>

<session-timeout>30</session-timeout>

</session-config>

修改完之后,需要重新启动服务器。

也可将以上配置放到某个应用的web.xml文件当中。

另外,还有一个方法:

session.setMaxInactiveInterval(int seconds);

5)删除session

session.invalidate();

6)session案例:

a, session验证

step1, 在登录成功后,在session对象上绑定数据

比如: session.setAttribute("user",user);

step2, 对需保护的资源(只有登录成功以后,才能访问的资源,比如 main.jsp) ,添加session验证代码:

Object obj = session.getAttribute("user");

if(obj == null){

//跳转到登录页面

}

我们在连接mysql数据库时一般都在url后面添加    useUnicode=true&characterEncoding=UTF-8 ,但为啥要添加呢?

添加作用是:指定字符的编码、解码格式。

例如:mysql数据库用gbk编码,而项目数据库用utf-8编码。这时如添加useUnicode=true&characterEncoding=UTF-8 ,那么作用有如下两个方面:

1. 存数据时:

数据库在存放项目数据时会先用UTF-8格式将数据解码成字节码,然后再将解码后的字节码重新使用GBK编码存放到数据库中。

2.取数据时:

在从数据库中取数据时,数据库会先将数据库中的数据按GBK格式解码成字节码,然后再将解码后的字节码重新按UTF-8格式编码数据,最后再将数据返回给客户端。

注意:在xml配置文件中配置数据库utl时,要使用&的转义字符也就是&

例如:<property name="url" value="jdbc:mysql://localhost:3306/email?useUnicode=true&characterEncoding=UTF-8" />

1、用户禁止cookie,如何继续使用session?(了解)

(1)当用户禁止cookie后,服务器仍会发送sessionId(以set-cookie消息头的方式),但浏览器会拒绝接受,这样,session机制会失效。

(2)可使用url重写来解决该问题

a,什么是url重写?

如某个组件需session机制支持,则不能直接使用该组件的地址去访问,而应该使用服务器生成的组件的地址(会在组件的地址后面添加sessionId)去访问。

b,如何重写?

//用于链接地址,表单提交地址。

response.encodeURL(String url);

//用于重定向

response.encodeRedirectURL(String url);

比如:

response.sendRedirect(response.encodeRedirectURL("list.jsp"));

转发不用考虑。

2、session的优缺点

优点:

session相对安全

session能够保存的数据类型更丰富

session能够保存的数据大小更大

缺点:

session需要将所有数据写在服务器端,所以,服务器会占用过多的内存空间。可考虑使用cookie来代替或使用数据库来保存状态(即数据)。

servlet容器如何处理请求资源路径?

比如,在浏览器地址栏输入http://ip:port/web04/abc.html

请求资源路径是:  /web04/abc.html

1, 容器依据应用名找到应用所在的文件夹。

2,容器会假设要访问的是一个servlet,会比较web.xml文件中<url-pattern>是否与"/abc.html"一致:

a,精确匹配:

b,通配符匹配:使用"*"来匹配任意的字符。比如<url-pattern>/*</url-pattern>

/aaa   /aaa.bbb   /aaa/bbb/ccc

c,后缀匹配:使用"*."开头,后接任意的字符。比如<url-pattern>*.do</url-pattern>

会匹配所有以".do"结尾的请求。

3,如果都不匹配,容器会查找静态页面,如果找到,就返回,找不到,返回404。

过滤器

(1)什么是过滤器?

servlet规范当中定义的一种特殊的组件,用来拦截容器的调用过程并进行相应的处理。

(2)如何写一个过滤器

step1,写一个java类,实现Filter接口。

step2,将处理逻辑写在doFilter方法里面。

step3,配置过滤器(web.xml)

(3)过滤器的初始化参数

step1,在web.xml,使用<init-param>配置初始化参数。

step2, 使用FilterConfig.getInitParameter(String paraname)来获取初始化参数值。

(4)过滤器的优先级

当有多个过滤器都满足过滤的条件,则容器依据<filter-mapping>的先后顺序来调用过滤器。

(5)优点:

a,可将多个web组件相同或者相近的处理逻辑(比如,session验证、权限的管理、编码的处理等等)集中写在过滤器里面,方便代码的维护。

b,可实现代码的“可插拔性”:删除或添加某些模块,不会影响到整个程序正常运行。

<filter>

<filter-name>filter1</filter-name>

<filter-class>web.Filter1</filter-class>

<!-- 初始化参数 -->

<init-param>

<param-name>illegalStr</param-name>

<param-value>pig</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>filter1</filter-name>

<url-pattern>/comment</url-pattern>

</filter-mapping>

过滤器运行过程:

1) 浏览器发送请求给服务器

2) 服务器的Servlet引擎创建Request对象&&Response对象

3) Servlet引擎先调用过滤器的doFilter方法,该方法有两个参数request和response,

(在过滤器中可访问到Request对象&&Response对象)

4) 过滤器对拦截的内容迚行处理

5) 之后调用SomeServlet的service方法

6) service方法执行

7) service方法执行结束后,将结果返回到过滤器

8) 过滤器将service方法返回的结果再次迚行过滤

9) 最后,Servlet引擎将结果返回给浏览器

ServletContext的作用是什么?

WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。

ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,

以通过ServletConfig.getServletContext方法获得ServletContext对象。

由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常被称之为context域对象。

监听器 **

1) 什么是监听器?

servlet规范当中定义的一种特殊的类,作用是监听容器当中产生的一些事件并迚行相应的处 理。 容器产生的事件指的是两大类事件:

第一大类 生命周期相关的事件,指的是当容器创建戒者销毁request,session,ServletContext对象时产 生的事件。

第二大类 绑订事件,指的是当调用request,session,ServletContext对象的 setAttribute,removeAttribute时产生的事件。

2) 如何写监听器

step1 写一个java类,实现特定的监听器接口类,如:HttpSessionListener (依据要监听的事件类型)。

step2 在接口声明方法中,实现监听的逻辑:

session对象一旦创建(就是访问该应用,就创建了session对象)就会执行该方法--

因这两个方法sessionCreated,sessionDestroyed都是重写父类的

课堂例子演示的本质是session的数量随着浏览器个数的变化而变化,

step3 配置(web.xml)。

<listener>

<listener-class>web.CountListener</listener-class>

</listener>

3) ServletContext接口

web服务器在启动时,会为每一个已部署的应用创建唯一的一个ServletContext实例。 该实例会一直存在,除非服务器关闭戒者应用被删除。

注意:每个应用对应唯一的一个ServletContext实例

a. 如何获得ServletContext实例。

GenericServlet提供了getServletContext()方法。

HttpSession提供了getServletContext()方法。

ServletConfig提供了getServletContext()方法。

b. 常用方法

ü 绑订数据

setAttribute(String name,Object obj);

getAttribute(String name);

removeAttribute(String name);

ü

配置全局的初始化参数

step1 在web.xml中,使用<context-param>配置的参数,可以被所有的servlet共享。

<context-param>

<param-name>version2</param-name>

<param-value>2</param-value>

</context-param>

step2 使用String ServletContext.getInitParameter(String paraName); 访问全局的初始化参数

依据逻辑路径获得实际部署时的物理路径:String ServletContext.getRealPath(String url);

注意:有先后顺序的要求:1<context-param>,2<listener>,3<filter>,4<servlet>

servlet线程安全问题

(1)servlet为什么会有线程安全问题?

默认情况下,servlet在容器内部只有一个实例;如果有多个请求同时访问某个servlet,容器会启动多个线程来调用这个servlet实例,就有可能发生线程安全问题:比如,多个线程同时去修改servlet实例的某个属性。

(2)如何解决?

a,使用synchronized关键字加锁

b,让servlet实现SingleThreadModel接口(不建议使用)容器会为每一个线程创建一个对应的servlet实例来处理请求。因为会产生过多的servlet实例,所以,建议少用。

javabean其实就是一个java类,不过他是有某些规定的java类,例如它有属性,且属性名为全小写,对每个属性有get和set方法,叫做设置器与获取器,这个类还必须有一个无参数的构造函数。
javabean的提出是为了实现可重用组件的需求提出的。其实jdk里面的大部分类都是javabean。在通常情况下javabean被用作处理业务逻辑来使用。

cookie_session的详细用法的更多相关文章

  1. C#播放声音的四种方法 +AxWindowsMediaPlayer的详细用法

    C#播放声音的四种方法 第一种是利用DirectX 1.安装了DirectX SDK(有9个DLL文件).这里我们只用到MicroSoft.DirectX.dll和 Microsoft.Directx ...

  2. 在DOS下的DEBUG命令的详细用法

    在DOS下的DEBUG命令的详细用法 名称 解释 格式 a (Assemble) 逐行汇编 a [address] c (Compare) 比较两内存块 c range address d (Dump ...

  3. __declspec关键字详细用法

    __declspec关键字详细用法 __declspec用于指定所给定类型的实例的与Microsoft相关的存储方式.其它的有关存储方式的修饰符如static与extern等是C和C++语言的ANSI ...

  4. CString.Format的详细用法(转)

    CString.Format的详细用法(转) 在MFC程序中,使用CString来处理字符串是一个很不错的选择.CString既可以处理Unicode标准的字符串,也可以处理ANSI标准的字符串.CS ...

  5. IFRAM的详细用法

    IFRAM的详细用法:   IFRAM的详细用法:  <IFRAME>用于设置文本或图形的浮动图文框或容器. BORDER <IFRAME BORDER="3"& ...

  6. 【转】java.util.vector中的vector的详细用法

    [转]java.util.vector中的vector的详细用法 ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些 import java.uti ...

  7. DOM Style样式对象的详细用法

    DOM Style样式对象的详细用法 HTML Style样式比较复杂,相应访问.修改方法也有所差异.参考相关资料,整理如下. 典型Html文件如下,有三种定义方式. <head>     ...

  8. css基础之 font的简写规则 以及 自定义 CSS3 @font-face详细用法

    Part 1 font简写 CSS的命名规则是用英文字母 数字 和下划线(一般用小写)来命名.简写css font的好处有三:一是写起来方便(就像键盘快捷键):二是简化代码:三是帮助你熟悉和深刻理解c ...

  9. Tomcat详细用法学习(三)

    本篇接上一篇<Tomcat详细用法学习(二)>,主要讲解服务器所要求的web应用的组织结构. 上一篇说到了如何使用服务器将自己的web应用映射成虚拟目录,以便于在浏览器中可以对自己开发的w ...

随机推荐

  1. 【贪心】Codeforces Round #436 (Div. 2) D. Make a Permutation!

    题意:给你一个长度为n的数组,每个元素都在1~n之间,要你改变最少的元素,使得它变成一个1~n的排列.在保证改动最少的基础上,要求字典序最小. 预处理cnt数组,cnt[i]代表i在原序列中出现的次数 ...

  2. 【置换群】【枚举约数】hdu6038 Function

    把b数组的所有置换群求出来,用数组记录一下每个大小所出现的次数. 然后求a的置换群,对每个置换群求能被其整除的b的置换群的大小总和(只有这些才能满足构造出一个f,且不自相矛盾),然后把它们全都乘起来就 ...

  3. PHP温故知新(二)

    2.安装和配置 安装这里要注意两点,是之前没有在意的: 1.将php.ini文件中的 cgi.fix_pathinfo设置为0 设置为0是为了解决一个安全漏洞,假如我们现在有这样一个URL:http: ...

  4. Objective-C字面量语法总结

    通常情况下,创建数组,字典的时候需要写一些很长的方法名,今天就总结一下如何使用字面量语法代替这些方法. 1.数值的创建 NSNumber *number1 = [NSNumber numberWith ...

  5. Android进阶笔记:AIDL内部实现详解 (一)

    AIDL内部实现详解 (一) AIDL的作用是实现跨进程通讯使用方法也非常的简单,他的设计模式是典型的C/S架构.使用AIDL只要在Client端和Server端的项目根目录下面创建一个aidl的文件 ...

  6. jquery 获取标签名(tagName)

    如果是为了取到tagName后再进行判断,那直接用下面的代码会更方便: $(element).is('input') 如果是要取到标签用作到别的地方,可以使用一下代码: $(element)[0].t ...

  7. 入门教程: JS认证和WebAPI

    转自:http://www.jianshu.com/p/fde63052a3a5 本教程会介绍如何在前端JS程序中集成IdentityServer.因为所有的处理都在前端,我们会使用一个JS库oidc ...

  8. python 如何调用子文件下的模块

    在python开发中,经常会出现调用子文件夹下的py模块 如上图,如果在test.py文件中,要调用meeting文件夹下面的huodongshu.py 模块, 直接在test.py 中 import ...

  9. 通用测试用例大全(转自——知了.Test)

    为方便平时写测试用例,整理如下: 功能 条件 测试步骤 测试数据 预期结果 备注 搜索或查询   单独遍历各查询条件,测试按各查询条件是否都能够查询出相应的值.   查询出符合条件的记录     设置 ...

  10. (转)Scala中协变(+)、逆变(-)、上界(<:)、下界(>:)简单介绍

    看源码的时候看到: trait ExtensionId[T <: Extension] { 没见过这个符号啊<: Scala上界(<:)和下界(>:) 1) U >: T ...