1. session补充
1.1 客户端禁用cookie后,也需要保持会话数据
注:客户端禁用cookie后,如果你是通过http://localhost/**访问的,则禁用无效
解决方案:将URL进行重写
地址栏后加上JESESSIONID=123132123
response. encodeRedirectURL(java.lang.String?url)
用于对sendRedirect方法后的url地址进行重写。
response. encodeURL(java.lang.String?url)
用于对表单action和超链接的url地址进行重写
以上方法会自动判断客户端是否禁用了cookie,如果禁用了,会对URL进行重写。没有禁用,就不重写
1.2 session搁置与失效(钝化与活化)
1.2.1 session失效
invalidate()销毁 //不推荐,应按需移除session中部分内容,而不是销毁整个对象
removeAttribute();//正确做法
1.2.2 更改session失效时间:默认为三十分钟
web.xml配置session失效时间:
<session-config>
<session-timeout>30</session-timeout> <!--以分钟为单位的正整数,至少一分钟-->
</session-config>
1.2.3 session持久化
应用场景:
1.用户正在使用应用,服务器停止,重启后仍需要有原有session对象
2.内存中有大量Httpsession对象,比较消耗资源,需要进行优化
当服务器停止时,利用ObjectOutputStream 将session持久化到硬盘上.(钝化) 当服务器再次启动时,将session从硬盘中读出来(活化)
停止web应用时,在C:\apache-tomcat-6.0.32\work\Catalina\localhost\应用名 路径下会生成一个名为SESSIONS.SER的文件
应用程序启动时,该文件中被持久化的 session被读出来,SESSSION.SER文件被销毁
注: session中封装信息的java类需要实现Serializable接口.
2.JSP入门
2.1JSP原理
每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) ,然后按照servlet的调用方式进行调用。由于JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问,JSP引擎如果发现JSP没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响。
2.2JSP最佳实践
3、JSP语法
3.1、模板元素:JSP页面中的HTML标记。
3.2、脚本表达式 :
作用:将数据输出到客户端.等同于out.print()
语法:<%=表达式或变量%>
3.3、脚本片段:(实际开发中,JSP中不允许出现一行java脚本)
作用:写Java代码。脚本片段会原封不动加入到翻译后的Servlet的service方法
语法:<%
语句1;
语句2;
%>
3.4、JSP的声明
作用:定义成员变量或方法
语法:
<%!java代码%>
3.5、Jsp注释
作用:被注释掉的java脚本不会被JSP引擎翻译
语法:<%--注释的java代码--%>
注:html的注释<!---->,java脚本同样会被翻译,但是会把输出的结果注释掉
4、JSP的指令
作用:指令是给JSP引擎(TOmcat)用的。指示引擎该如何对待其他的JSP内容
语法:
<%@ 指令名称 指令属性="值" ...%>
多个属性可以写到同一个指令中,也可以分开写
4.1、page指令
属性:
language:指示使用的脚本语言。目前只支持java。默认也是java
extends:指示生成的Servlet的父类。不需要更改
*import:导入java脚本中使用到的类或者包。同java代码中的package
JSP引擎会自动导入一下包:
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
写法形式:
<%@ page import="java.util.Date,java.util.UUID"%>
或者
<%@ page import="java.util.Date"%>
<%@ page import="java.util.UUID"%>
Eclipse中可以使用Alt+/引入类,自动导入该类
*session:指示是否生成HttpSession对象。true|false默认值是true
buffer:配置输出流的缓存的大小none|8kb|sizeKb 默认值是8Kb。不需要改
autoFlush:缓存满了是否自动刷新。true|false 默认值是true。不需要改
isThreadSafe:指示生成的servlet是否继承SingleThreadModel接口。true|false false是才继承该接口。默认值是true
*errorPage:指示错误提示页面的URL地址。地址如果以"/'"表示绝对路径。
配置全局错误提示页面另外一种方式:
修改web.xml
<error-page>
<exception-type>java.lang.ArithmeticException</exception-type>
<location>/error.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
*isErrorPage:指示jsp对应的Servlet是否生成Exception对象。true|false
默认值是false
*contentType:指示生成的html的MIME类型。text/html;charset=UTF-8 等同于ServletResponse.setContentType();
*pageEncoding:指示JSP引擎在翻译JSP所生成的Servlet使用的编码。(代替contentType)
*isELIgnored:是否忽略EL表达式。true|false。true是忽略。默认是false
4.2、include指令
静态包含。
注:开发中能用静态包含就不要用动态包含。
4.3、taglib指令
作用:引入外部的标签
<%@ taglib uri="标签的URI地址" prefix="前缀"%>
5、九大隐式对象
类型 引用名称(隐式对象)
5.1、HttpServletRequest request
5.2、HttpServletResponse response
5.3、HttpSession session (page指令session必须为true)
5.4、ServletContextapplication
5.5、ServletConfigconfig
5.6、Object page(指示Servlet对象本身,就如同用this)
5.7、Throwableexception (page指令isErrorPage必须为true)
5.8、JspWriterout 同HttpServletResponse的getWriter返回的PrintWriter
5.9、PageContext pageContext
6、PageContext对象
代表当前JSP的上下文环境
作用:
6.1、获取其他8大隐式对象
6.2、向各种域范围中放对象、取对象、删除对象
6.3、提供了向forwar和include的便捷方法
setAttribute(java.lang.String?name,java.lang.Object?value):把对象绑定到name上,放到page范围(当前页面范围)
getAttribute(java.lang.String?name):获取page域中的绑定的对象
removeAttribute(java.lang.String?name):删除所有域中的所有名字为name的对象
setAttribute(java.lang.String?name, java.lang.Object?value,int?scope):绑定对象并放入scope指定的域范围中
getAttribute(java.lang.String?name,int?scope)
removeAttribute(java.lang.String?name,int?scope):删除指定范围内的域对象
forward(String url):url如果以“/” 表示绝对路径
include(String url):url如果以“/” 表示绝对路径
7.四大域对象
7.1、PageContext:域对象中存放的内容的存活时间 当前页面
7.2、ServletRequest:请求范围
7.3、HttpSession:会话范围
7.4、ServletContext:应用范围
8.JSP的动作元素(内置标签)
<jsp:include>动态包含
<jsp:forward>转发
<jsp:param>参数