1、如果用户禁止cookie,如何继续使用session (了解)?
1)可以使用url重写来解决这个问题。
2)什么是url重写
浏览器向服务器发请求时,请求地址由服务器来生成(服务器会在请求地址后面添加 sessionId)。
3)如何编程
a, response.encodeURL(String url) ;
该方法用在链接地址,表单提交地址。比如
<a href="<%=response.encodeURL("some")%>"></a>
<form action="<%=response.encodeURL("del.do")%>">
b, response.encodeRedirectURL(String url);
该方法要用在重定向,比如
response.sendRedirect(
"<%=response.encodeRedirectURL("list.do")%>");
注意:
转发不用考虑。因为转发是服务器内部 一个组件通过容器调用另外一个组件,与 session无关。
2、prototype.js
是一个流行的js框架,提供了很多有用的函数。
a, $(id): document.getElementById(id);
b, $F(id): $(id).value;
c, $(id1,id2,id3...): 依据id1,id2...分别查找相应的节点,然后放到一个数组里面返回。
d, strip(): 除掉字符串两端的空格。
e, evalJSON(): 将json字符串变成javascript对象。
3、过滤器
(1)过滤器是什么?
servlet规范当中定义的一种特殊的组件,可以拦截servlet容器调用的过程并进行相应的处理。
(2)如何写一个过滤器?
step1 ,写一个java类,实现Filter接口。
step2, 在doFilter方法里面,编写拦截处理代码。
step3, 配置过滤器 (web.xml)。
(3)过滤器的优先级
当有多个过滤器都满足过滤的条件,容器 会按照<filter-mapping>的 先后顺序来执行过滤器。
(4)优点
a, 可以将多个 组件相同的处理逻辑集中写在过滤器里面,方便代码的维护。
b, 可以实现代码的"可插拔性": 增加或者减少某个模块,不影响整个程序的
正常执行。
4、监听器
(1)什么是监听器
servlet规范当中定义的一种特殊的组件, 用来监听容器产生的事件并进行相应的处理。
主要有两大类事件:
a, 生命周期相关的事件: 当容器创建或者销毁request,session,ServletContext(servlet上下文)时产生的事件。
b, 绑订相关的事件:当容器调用了request, session,ServletContext的setAttribute, removeAttribute产生的事件。
(2)如何写一个监听器
step1, 写一个java类,实现相应的监听器接口。 (要依据监听的事件选择相应的监听器接口,比如, 要监听session的创建或者销毁,选择 HttpSessionListener)。
step2, 实现 监听器接口方法。
setp3, 配置监听器(注册)。
(3)ServletContext接口
1)servlet上下文是什么?
当容器启动的时候,会为每一个应用创建唯一的一个符合ServletContext接口的一个对象,该对象会一直存在,除非容器关闭或者应用被卸载。
2)如何获得servlet上下文?
a, GenericServlet 提供了getServletContext();
b, HttpSession 提供了getServletContext();
c, ServletConfig 提供了getServletContext();
d, FilterConfig 提供了getServletContext();
3)作用
a, 绑订数据 setAttribute,removeAttribute, getAttribute
注意:
request,session,ServletContext都可以绑订数据,区别如下:
区别1: 绑订的时间长度不一样,request绑订的数据存在的时间是一次请求与响应期间,
session是多次请求与响应期间,ServletContext会一直存在。
区别2: request绑订的数据可以被同一个请求 当中所涉及的各个组件访问(转发)。session绑订的数据可以被多个请求所涉及的组件访问。
ServletContext绑订的数据可以随时访问,任何组件都可以访问。
尽量优先使用生命周期短的,比如,使用 request能解决问题,就不要用session。
b,访问全局的初始化参数全局的初始化参数指的是可以 被同一个 应用中的所有的servlet,filter访问的初始化参数。String getInitParameter(String paraName);
c, 依据逻辑路径获得实际部署时的物理路径
5、servlet线程安全问题
(1)为什么说servlet会有线程安全问题?
a, 容器在默认情况下,对于每个servlet,只有一个实例。
b, 当有多个请求都去访问某个servlet,容器 就会产生多个线程调用servlet对象,就有可能产生线程不安全的情况(比如,多个线程去修改servlet对象的属性值)。
(2)如何解决
a, 使用 synchronized加锁。加锁之后对性能会有一些影响。
b, 让servlet实现 SingleThreadModel接口。容器会为每一个线程创建一个servlet实例。 不建议使用(如果请求过多,会产生过多的servlet对象)。
6、上传文件(扩展)
step1, 设置表单的enctype="multipart/form-data",并且,表单的提交方式必须为post。
step2, 在服务器端,不能够使用request.getParameter方法。
此时,要使用InputStream, request.getInputStream()获得一个字节输入流,然后分析该流获得相应的数据。一般使用一些工具来分析,比如apache提供的commons-fileupload.jar来分析。
7、jsp 标签
(1) jsp标签
1)jstl (java standard taglib java标准标签库,由apache提供的一些常用的标签,后来捐献给了sun,sun将这些标签命名为jstl)。
2)编程步骤
step1,将jstl相关的jar文件拷贝到WEB-INF\lib下。
D:\czh\MyEclipse 5.5.1 GA\
eclipse\
plugins\
com.genuitec.eclipse.j2eedt.core_5.5.1\
data\
libraryset\JSTL1.1\lib
standard.jar jstl.jar
step2, 使用taglib指令引入要使用的jsp标签<%@taglib uri="" prefix=""%>
uri: 命名空间,就是一个字符串,用来区分同名的元素。为了保证命名空间的唯一性,经常使用一个域名来表示命名空间。
prefix:前缀
1、jsp标签是如何运行的?
容器依据标签的命名空间找到标签的描述文件(容器会从WEB-INF\下查找,找不到,再查找WEB-INF\lib下的jar文件),接下来,依据标签的名称
找到标签的描述(标签类的名称),然后将这个标签类实例化,调用其方法。
2、jstl的核心标签
1)if标签
<c:if test="" var="" scope="">
标签体
</c:if>
如果test属性值为true,则执行标签体的内容。
标签体可以是html,也可以是java代码。test属性可以使用el表达式来赋值。var属性用来指定一个绑订名称 scope属性用来指定绑订的范围(page,request,session,application)
2) choose标签
<c:choose>
<c:when test="">
标签体
</c:when>
....
<c:otherwise>
</c:otherwise>
</c:choose>
when表示一个分支,当test属性值为 true时,执行该分支的内容。
test属性可以使用el表达式。when标签可以出现1次或者多次。otherwise标签可以出现0次或者1次,表示例外。
3) forEach标签
遍历集合
<c:forEach var="" items="" varStatus=""> </c:forEach>
items属性:指定要遍历的集合,可以使用el
表达式。
var属性:指定一个 绑订名称,绑订范围是 pageContext,容器每一次从集合当中取一个对象然后将这个对象绑订到pageContext, 绑订名称由var属性来指定。
varStatus属性:指定一个绑订名称,绑订范围是pageContext,绑订值是一个封装了当前迭代状态的对象。该对象有几个方法可以获得当前迭代的状态,比如
getIndex():返回当前正在被访问的对象的下标,下标从0开始。
getCount():返回是第几次迭代。值从1开始。
3、自定义标签
step1, 写一个java类,继承SimpleTagSupport类。
step2, 在doTag方法里,编写相应的处理逻辑。
step3, 在.tld文件里面,描述标签。
.tld文件要放在WEB-INF\下。
<body-content>empty</body-content>
该标签没有标签体。
<body-content>scriptless</body-content>
该标签可以有标签体,但是, 标签体里面不能够写java代码(即不能够写<% %> <%= %> <%! %>)。
<body-content>JSP</body-content>
标签有标签体,标签体的内容可以写java 代码。 只有复杂标签技术才支持JSP,简单标签技术只支持empty,scriptless
4、如果使用javaee5.0,如何使用el表达式和jstl标签
javaee5.0对应的servlet规范是servlet2.5, tomcat6.0实现了该规范。
javaee1.4对应的servlet规范是servlet2.4, tomcat5.5实现了该规范。
如果要使用javaee5.0,建议使用tomcat6.0及以上版本。
另外,如果要使用jstl标签,因为javaee5.0 已经将jstl对应的jar文件作为javaee5的核心包包含进来了,不必再拷贝相应的jar文件到 WEB-INF\lib下了。
8、mvc (model,view,controller)
(1)什么是mvc?
是一种软件架构的思想, 即将一个软件的模块按照 模型、视图、控制器来进行划分:其中,模型用来封装业务逻辑;视图用来生成表示逻辑;控制器用来
协调模型和视图(视图要通过控制器来调用模型,模型返回的处理结果也要先交给控制器,由控制器来选择合适的视图来显示处理结果)。
使用mvc最重要的原因是可以实现"模型的复用“:
一方面,模型不用关心处理结果如何展现,只需要将处理结果交给不同的视图来展现即可(即将模型返回的结果用不同的方式来展现);另外一方面,模型可以使用不同的视图来访问。
(2)如何使用mvc来开发一个web应用程序
1)使用 servlet或者filter来充当控制器 , 使用 java类来充当模型 , 使用jsp来充当视图 。
注意:
模型也可以使用一些企业级的java组件. 比如,ejb,spring容器管理的javabean来实现。 视图也可以使用jsf,模板技术来实现。
(3)mvc的优点
1) 可以实现“模型的复用” 。
2 )系统的维护性更好 :比如添加一个视图或者修改视图不会影响模型;反过来,修改或者添加新的模型,也不会影响视图。
3) 方便测试 :比如,如果将业务处理代码直接写在servlet里面,需要部署之后才能测试;而写在java类里面,可以立即测试(不依赖servlet容器)。
(4)mvc的缺点
使用mvc, 会增加代码量、相应地也会增加。 软件开发的成本,设计的难度也会增加。