JSP简介

引言:Servlet生成动态页面的不足之处? //不代表做不了,是不太好

  1. 开发方式麻烦:继承父类、覆盖方法、配置web.xml
  2. 代码修改麻烦:重新编译、部署、重启服务
  3. 显示方式麻烦:获取流、out.println("");逐行打印
  4. 协同开发麻烦:UI负责美化页面,程序员负责代码编写。UI不懂Java,程序员又不能将所有前台的内容,全通过流输出。

一、JSP(Java Server Pages)Java服务器页面

  1. 概念:一个简化的Servlet设计,在HTML中插入Java代码,用以高效开发Web应用的动态网页。
  2. 作用:替换显示部分的Servlet。(使用 *.jsp文件替换XXXJSP.java)

二、JSP开发:

  1. 第一个JSP:动态显示当前系统时间
    I. 构建Web应用
    II. 创建*.jsp放置在WebRoot下(WEB-INF平级位置)
    III. 代码:

IV. 访问:
I. WebRoot下:http://localhost:8080/Web_JSP_Day1/first.jsp
II. xxx文件夹下:http://localhost:8080/Web_JSP_Day1/Files/first.jsp

  1. 区别:

//Tomcat作为Java服务器,为什么可以运行jsp?
//但对于JavaEE标准而言,都是java代码。而Tomcat实现了JavaEE也应该是运行Java代码。
//就是因为JavaEE标准中的请求和响应模式书写麻烦,才有了jsp

三、JSP实现原理://tomcat/work/…

四、HTML与Java集成:

  1. 脚本:
    I. 输出脚本:
    1). 作用:将Java表达式的结果输出到页面中(out.print())。
    2). 语法:<%= Java表达式 %>
    3). 注意:表达式不能加";"。

II. 声明脚本【没用】:
1). 作用:定义变量或者函数。
2). 语法:<%! 变量、函数 %>
3). 注意:声明脚本中的变量或函数,必须由输出脚本或者普通脚本使用。

III. 普通脚本:
1). 作用:可使用所有Java语法(除了定义函数)。
2). 语法:<% anything %>
3). 注意:脚本与脚本之间不可嵌套,脚本与HTML标签不可嵌套。(缺点:太麻烦,可读性太差,未来最好不用脚本)

  1. 指令:
    I. page:
    1). 语法:<%@page attribute1=value1 attribute2=value2 attributeN=valueN %>
    2). 属性:
    a. 集成语言:language=“java”
    b. 显示编码:pageEncoding=“UTF-8” //JSP页面的解码格式
    c. 响应编码:contentType=“UTF-8” //服务器给客户端传输本文的编码格式
    d. 内部导包:import=“java.util.* , java.sql.*” //也可通过多个<%@page import="" %>分别导包
    e. 创建会话:session=“true|false” //默认true 饿汉式,立即创建Session;false 懒汉式,使用时创建Session。
    f. 错误页面:isErrorPage=“true|false” //指定当前jsp为错误页面
    g. 错误跳转:errorPage=" xxx.jsp " //如果有异常,跳转至错误页面

II. include:静态包含
1). 语法:<%include file=“被包含的jsp路径” %>
2). 作用:会将外部文件的源代码包含在jsp中。
3). 注意:可能会有重名的冲突问题,不建议使用。

III. taglib://次日EL讲解
1). 语法:<%taglib uri=“外部标签库路径” prefix=“前缀” %>
2). 作用:引入JSP的标准标签库。

  1. 动作:
    I. include:动态包含
    1). 语法:
    2). 作用:会将外部文件输出结果包含在jsp中。
    3). 注意:可更好的包含外部文件,对代码没有侵入性,建议使用。

  2. 内置对象:由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)表达式语言:

  1. 概念:获取作用域中的数据。
  2. 作用:用于替换输出脚本<%= %>
  3. 使用:
    I. 语法:
    ${scope.key} //获取具体某个作用域中的数据
    ${key } //获取作用域中的数据、逐级查找(pageContext【pageScope】、request、session、application)。

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):

  1. 概念:JSP的标准标签库,可对EL获取到的数据进行逻辑操作。
  2. 作用:与EL合作完成数据的展示。
  3. 应用:
    I. 引入标签库:<%@taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>
    II. 通过前缀使用:
    III. 标签:
    1). 判断:

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整合:

开发顺序:

  1. DAO
    I. table
    II. entity
    III. Dao接口
    IV. Dao实现 —> JdbcTemplate

  2. Service
    I. Service接口
    II. Service实现(调用Dao实现类,并控制事务TransactionManager)

  3. Action:处理请求的Servlet
    I. [ 收集请求中的数据 ]
    II. 调用业务功能(Service实现类)
    III. [ 在request作用域中保存数据 ]
    IV. 流程跳转[ forward | redirect ] -> xxx.jsp

  4. JSP:
    I. [ 在request作用域中获取数据 ]
    II. 使用EL+JSTL将数据嵌套在HTML标签中。

  5. Filter:
    I. EncodingFilter
    II. CheckLoginedFilter

JSPDay3

微信:自定义公钥TOKEN + Timestamp + nonce 排序 -> SHA1加密 -> signature对比

一、加密:

  1. 算法:
    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哈希值])

  2. 实现:
    I. 导入commons-codec-1.10.jar
    II. 使用org.apache.commons.codec.digest.DigestUtils工具类
    III. MD5加密:md5Hex(String str);
    IV. SHA1加密:sha1Hex(String str);
    V. 使用密文和密文对比。

  3. 实战: //SHA1同理

二、作业:EMS

你可能感兴趣的:(JSP简介)