引言:Servlet生成动态页面的不足之处? //不代表做不了,是不太好
一、JSP(Java Server Pages)Java服务器页面
二、JSP开发:
IV. 访问:
I. WebRoot下:http://localhost:8080/Web_JSP_Day1/first.jsp
II. xxx文件夹下:http://localhost:8080/Web_JSP_Day1/Files/first.jsp
//Tomcat作为Java服务器,为什么可以运行jsp?
//但对于JavaEE标准而言,都是java代码。而Tomcat实现了JavaEE也应该是运行Java代码。
//就是因为JavaEE标准中的请求和响应模式书写麻烦,才有了jsp
三、JSP实现原理://tomcat/work/…
四、HTML与Java集成:
II. 声明脚本【没用】:
1). 作用:定义变量或者函数。
2). 语法:<%! 变量、函数 %>
3). 注意:声明脚本中的变量或函数,必须由输出脚本或者普通脚本使用。
III. 普通脚本:
1). 作用:可使用所有Java语法(除了定义函数)。
2). 语法:<% anything %>
3). 注意:脚本与脚本之间不可嵌套,脚本与HTML标签不可嵌套。(缺点:太麻烦,可读性太差,未来最好不用脚本)
II. include:静态包含
1). 语法:<%include file=“被包含的jsp路径” %>
2). 作用:会将外部文件的源代码包含在jsp中。
3). 注意:可能会有重名的冲突问题,不建议使用。
III. taglib://次日EL讲解
1). 语法:<%taglib uri=“外部标签库路径” prefix=“前缀” %>
2). 作用:引入JSP的标准标签库。
动作:
I. include:动态包含
1). 语法:
2). 作用:会将外部文件输出结果包含在jsp中。
3). 注意:可更好的包含外部文件,对代码没有侵入性,建议使用。
内置对象:由JSP自动创建的对象,可以直接使用。
I. request:HttpServletRequest,(动态获取web应用的名称:request.getContextPath();)
II. response:HttpServletResponse
III. session:HttpSession
IV. application:ServletContext
V. out:Writer的子类,与PrintWriter功能完全一致,可输出标签或Java代码。
VI. page:Object类型,代表JSP本身,类似于Java中的this。
VII. config:ServletConfig可取得服务器的配置信息。
VIII.exception:Exception,当<%page isErrorPage=“true” %>时,才可以使用。
IX. pageContext:当前页面的作用域对象,一旦跳转则失效。主要用来通过它获取其他8个内置对象、或者操作其他对象的作用域。
1). 获得其他内置对象:
pageContext.getRequest();
pageContext.getSession();
pageContext.getServletContext();
pageContext.getOut();
…
2). 操作其他内置对象的作用域:
pageContext.setAttribute(“key” , value); //当前页面有效
pageContext.setAttribute(“key” , value , PageContext.PAGE_SCOPE); //当前页面有效
pageContext.setAttribute(“key” , value , PageContext.REQUEST_SCOPE);
pageContext.setAttribute(“key” , value , PageContext.SESSION_SCOPE);
pageContext.setAttribute(“key” , value , PageContext.APPLICATION_SCOPE);
作业:将现有项目修改为JSP
JSPDay2
一、EL(Expression Language)表达式语言:
II. 获取基本类型、字符串:
例1:
request.setAttribute(“name” , “tom”); //存储在request作用域
${requestScope.name} //获取request作用域中name的键所对应的值
例2:
request.setAttribute(“name” , “tom”); //存储在request作用域
${name } //从最小作用域逐级查找name的键所对应的值
EL和JSP脚本的区别:
<%=request.getAttribute(“key”) %> 没找到返回null
${requestScope.key } 没找到返回“”
III. 获取对象类型://只能访问对象的get方法,必须按照命名规范定义
IV. 数组、集合:(Array、List、Map) (Set没下标,无法直接访问元素,后续可遍历)
注意:EL获取Map中的整数key时,类型为long,所以保存时,也必须为long,否则访问不到。 //map.put(3L,“CCC”);
IV. 运算:
1). 算数运算符: + - * / (%、mod)
2). 关系运算符:(> 、gt)(>=、ge )(<、 lt)(<=、 le)(==、 eq)(!= 、ne)
3). 逻辑运算符:(&& 、and)(|| 、or)(! 、not)
4). 非空运算符:empty //判断命名属性是否为空
V. 获得特殊对象:
1). pageContext:
<%=request.getContextPath() %> //动态获得应用名
${pageContext.request.contextPath } //动态获得应用名
2). param:EL获得表单数据(没用)
Servlet:request.getParameter(“name”);
JSP-EL:${param.name}
3). Cookie:EL获得Cookie
${cookie.username }
${cookie.JSESSIONID }
${cookie.JSESSIONID.value }
二、JSTL(JSP Standard Tag Library):
2). 多条件判断:
3). 遍历:
4). 日期格式化:<%@ taglib uri=”http://java.sun.com/jsp/jstl/fmt” prefix=”fmt”%>
5). URL重写:在Cookie禁用的情况之下,通过拼接JSESSIONID来传递ID值,便于下次访问时仍可查找到上一次的Session对象
经验:所有涉及到页面跳转或者重定向跳转时,都应使用URL重写。(转发会自动带有JSESSIONID跳转)
注意:
6). 移除://移除作用域中的命名属性 //可用于request、session、application
三、JSP和Servlet整合:
开发顺序:
DAO
I. table
II. entity
III. Dao接口
IV. Dao实现 —> JdbcTemplate
Service
I. Service接口
II. Service实现(调用Dao实现类,并控制事务TransactionManager)
Action:处理请求的Servlet
I. [ 收集请求中的数据 ]
II. 调用业务功能(Service实现类)
III. [ 在request作用域中保存数据 ]
IV. 流程跳转[ forward | redirect ] -> xxx.jsp
JSP:
I. [ 在request作用域中获取数据 ]
II. 使用EL+JSTL将数据嵌套在HTML标签中。
Filter:
I. EncodingFilter
II. CheckLoginedFilter
JSPDay3
微信:自定义公钥TOKEN + Timestamp + nonce 排序 -> SHA1加密 -> signature对比
一、加密:
算法:
I. 可逆:
1). 对称加密(可逆):(DES)数据加密标准,速度较快,适用于加密大量数据的场合。 //一把秘钥(Session Key)
2). 非对称加密(可逆):(RSA) //两把秘钥 (Public Key、Private Key)
II. 不可逆:长度32位的16进制字符串
1). MD5:它是基于Hash变换而来的,MD5将任意长度的“字节串”变换成一个128bit的大整数 //[唯一的数字签名|指纹]
2). SHA1[160bit] 安全的哈希算法
3). SHA256[256bit哈希值])
实现:
I. 导入commons-codec-1.10.jar
II. 使用org.apache.commons.codec.digest.DigestUtils工具类
III. MD5加密:md5Hex(String str);
IV. SHA1加密:sha1Hex(String str);
V. 使用密文和密文对比。
实战: //SHA1同理
二、作业:EMS