Cookie
会话技术:Cookie(客户端),Session(服务端)。一次会话中包含多次请求和响应直到一端断开,在一次会话范围内多次请求间共享数据。
Cookie由服务器发送给客户端使用,供客户端多次使用。服务端:创建Cookie(Cookie对象的构造函数传入Cookie信息)、发送Cookie(response.addCookie方法传入参数),接收Cookie(getCookies)。
idea的Settings-->File and Code Templates-->Web-->Java code templates下可以修改Servlet Annoteated Class自动生成的代码以方便自定义自动生成。
服务器发送cookie保存在,响应头的set-cookie下的参数被客户端获取。当客户端再次请求数据时,请求头中的cookie字段添加了之前获取的cookie。
一次请求可以发送多个cookie键值对(多个Cookie对象通过addCookie方法添加),cookie默认在浏览器关闭时被销毁,可设置持久化存储到硬盘时间(Cookie的setMaxAge方法传入整数秒设定存活时间,0为删除,负数为默认方式)
cookie在tomcat8之后支持中文数据(直接使用,但特殊字符仍需编码),在tomcat8之前需要编码(可以使用URLEncoder.encode方法decode解码)。cookie范围,默认情况下tomcat服务器多个项目的cookie不能共享(只能在当前虚拟目录下共享),可以使用setPath方法设置为/则可以共享。
不同的tomcat服务器直接的cookie也可以共享,使用setDomain(String path),设置一级域名,则可以在指定一级域名下共享。
浏览器下的cookie大小有限制(4kb,20个),用于存储少量,不太敏感的数据(不安全)。可以用于网页离线的信息设置和同步(不登录情况下的网页偏好设置)。
JSP
JSP(Java Server Page java服务器端页面),可定义html标签和java代码,用于简化书写。
服务器将jsp文件转换为java文件,将java文件编译为字节码文件,字节码文件用于响应客户端,该字节码文件或说jsp实质上是一个Servlet。
html写入java格式为:<% java代码 %>,在selvlet的service方法中。<%! java代码 %>转换后对应到Servlet的成员变量。<%= 代码 %>,转换后为Servlet的service中的输出方法的参数。
JSP的内置对象:request、response、out(字符输出流对象,相比较response.getWriter字符流比out的方法先输出[tomcat响应数据的机制]。建议out一致)
jsp使用<% { %> <% } %>等截断方案,将out语句输出直接写为标签。
JSP指令,用于配置JSP页面,导入资源文件,page配置JSP页面,<%@ page contentType="设置MINE类型,设置页面编码,(低级IDE使用pageEncoding)" language="x" import导包,errorPage转到的错误界面,isErrorPage标记为错误界面用于使用内置exception对象%>。
include引入其他页面,<%@include file="" %> taglib导入资源<%@taglib prefix="前缀" uri="标签库"%>,使用时用前缀开头使用标签库中内容。
注释:html:<!-- -->,jsp注释:<%-- --%>。jsp注释不会在转换后发送给客户端,html注释会发送。
内置对象:pageContext,request,session,application,response,page,out,config,exception。在对应的Servlet中定义
Session
Session服务器端会话技术(HTTPSession对象[使用request.getSession方式获取]),在一次会话的多次请求间共享数据,存放在服务器端。方法如setAttribute,getAttribute,removeAttribute。
Session依赖于cookie。客户端从服务器获取Session,并且没有cookie,则服务器端响应头set-cookie包含JSESSIONID字段为一个id(session对象)。其他次访问客户端携带cookie的sessionid请求服务器,服务器对比session是否一致,确保一次会话获取的多个session是同一个。
客户端请求数据时session的是否相同依赖于cookie的存活状态。服务器端重启后session会重建,需要使用session的钝化,将对象序列化到硬盘,session的活化,服务器启动后将保存session加载到内存中。
tomcat的work目录下存储了session,在关闭时自动钝化操作,启动自动活化。idea中无法自动活化。
session的实效时间:服务器关闭时,invalidate方法,session默认失效时间为30分钟(定义在web.xml中)。
session用于存储一次会话的多次请求数据,存储在服务器端,存储任意类型任意大小。session相对安全。
MVC开发模式
MVC开发模式:java的web开发借鉴mvc开发模式,使得程序的设计更合理(弥补jsp的难以维护)(Model View Controller 模型 视图 控制器),服务器中控制器调用模型,返回的数据交给视图展示数据。
Mode使用JavaBean查询数据库,封装对象,Controller使用Servlet获取用户输入调用模型,数据返回给视图,View使用jsp展示数据(jsp中少写入java代码)。MVC使得项目架构复杂。
数据操作:三层架构,使用控制器Servlet处理,控制器调用XXXService.java数据(JavaBean)操作,该数据操作调用UserDao.java。最后控制器重定向地址。
js中使用location.href可以转到指定Servlet处理数据。
设计过程中分析输入和输出有助于更好的分析和实现。
EL、JSTL
EL表达式:Expression Language表达式语言。替换和简化jsp页面的java代码编写,也可以在js中使用。格式如 ${ 表达式 }, page的 isELIgnore全局忽略EL表达式, 或使用转义符忽略单个。
运算:可以使用的运算符为:使用算数运算符,比较运算符,逻辑运算符,empty(判断字符串集合数组对象是否为null且长度是否为0)。
获取值:从域对象中获取值,使用域名.键名方式获取,获取不到则为空字符串。省略域名,直接使用键名获取,则会依次从小到大范围查找域名的键值。
获取自定义的对象值,使用域名和键名获取对象后,使用其属性(getter,setter去掉get和set,首字母小写)获取值(实质会调用getter和setter)。
List集合对象获取后,获取值直接使用[]即可,Map集合使用[]或""通过键获取值。
empty使用格式如${empty str},判断str是否为空或null。not empty取反。
EL表达式中有11个隐式对象,如pageContext获取jsp其他8个内置对象。获取其它隐式对象如request,可以获取虚拟目录contextPath,
JSTL标签(JavaServer Pages Tag Library JSP标准标签库,由apache提供),用标签简化和替换java代码。导入jstl的jar包后,使用taglib引入标签库
if 选择语句标签。使用test属性接收boolean表达式,以确定是否显示标签体内容。test中可以写入EL表达式。该标签没有else,需要则重新写一个标签逻辑。
choose类似switch语句:使用choose内的使用when标签做数字判断,otherwise做其他情况。
foreach标签:使用begin属性开始值,使用end结束值,使用var临时变量,使用step表示步长,varStatus循环状态index容器中元素索引从1开始和count次数,完成重复操作。
使用items容器对象,var临时变量,varStatus循环状态对象的index和count,获取容器或域对象的内容在var中存在并取出。