JSP

来源:互联网 发布:剑灵捏脸数据天族 编辑:程序博客网 时间:2024/04/29 10:14

JSP笔记
JSP引言
现有代码缺点: view层的代码有大量的java代码存在。(java代码中嵌套html标签,不利于美工维护开发。)

JSP简介

Java Server Pages 服务器页面。
1. 作用
用来替代现有的Servlet(View), 展示界面。
2. 特点
在html标签中嵌套java代码。

在浏览器显示当前系统时间.
1. 文件命名: *.jsp
2. 代码组成==html+java代码
3. java代码嵌套语法: <%= java代码 %>
JSP开发步骤
1. 写一个jsp
2. 部署jsp到tomcat中: jsp的部署位置相当于HTML
3. 启动tomcat
4. 访问
http://ip:port/项目名/jsp相对项目的路径
JSP和Servlet对比
1. JSP 开发以HTML为主。便于分工合作,有利于没美工独立维护
2. JSP 开发无需web.xml中配置
3. JSP代码修改,无需重启tomcat。

java脚本
1. 表达式脚本:
语法: <%= java表达式 %>
作用: 将表达式结果输出给浏览器。
注意: 表达式脚本中的java代码末尾不能有分号。
2. 普通脚本.
语法: <% java代码循环,条件分之。%>
3. 声明脚本
语法: <%! 声明的java代码(定义变量,定义函数) %>
注意: java脚本标签不能嵌套html标签和java脚本标签
作业
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
使用JSP向浏览器输出一个99惩罚表,单行蓝色,偶数行红色。
MyEclipse简化开发JSP程序
MyEclipse部署JSP程序
JSP程序在myeclipse中放在webroot目录下。

JSP执行原理
1. JSP其实就是Servlet程序。
浏览器第一次访问服务器中的JSP程序时,Tomcat会将jsp翻译成servlet程序放在work
的目录中。由Servlet提供输出结果。
2. JSP中(HTML标签+java脚本)[翻译规则]
HTML标签翻译成Servlet中输出语句中的内容。
表达式脚本翻译成servlet中的输出语句中的内容。
普通脚本翻译成servlet的service方法内部的一般代码
声明脚本翻译成servlet的service方法外部的代码(属性/方法)
Alt text
JSP指令元素
JSP页面指令
语法: <%@ page 属性名=’值’ 属性=’值’%>
作用: 描述当前jsp信息(编码、session创建时机,异常等等)
1. pageEncoding: 描述当前jsp的编码格式。
相当于: response.setCharacterEncoding();
2. contentType: 描述响应类型和编码
相当于: response.setContentType(“text/html;chasert=utf­8”);
3. session: true | false(跨请求保存用户信息)
true: 当前jsp的访问有session。(相当于在servlet中写了request.getSession())
false: 当前jsp的访问不会存在session对象。
4. isErrorPage: 表明当前页面是否是错误页面。
true: 当前页面存在内置对象exception
5. errorPage: 如果当前页面有异常跳转到errorPage指定的页面。
6. import: 导入jsp的java脚本中使用的外部类。
包含指令
语法: <%@ include file=’url­pattern路径。’%>
静态包含,源代码包含。
Alt text
JSP动作指令

动态包含,输出包含。(和servlet中包含一样。)
Alt text
包含应用总结
1. 静态包含需要注意变量命名冲突问题。
2. 实际开发中使用哪种都行。
3. 应用场景: (两者均可)
①相同页面作为包含页面
②外部css或者js资源引入部分,作为被包含的页面使用。
标签库指令
语法: <%@taglib uri=” prefix=” %>
作用: 当使用第三方提供标签库时,需要使用该指令导入。
JSP 9大隐含对象(内置)
exception Exception 代表catch的异常对象。 request HttpServletRequest
session HttpSession application ServletContext response
HttpServletResponse out JspWriter(PrintWriter) cofig ServletConfig page
Object(this) pageContext PageContext 2016年11月16日早提问:
pageContext深度剖析
1. 作用域
pageContext 只能在当前页面使用。
存值: pageContext.setAttribute(“key”,Value);
取值: pageContext.getAttribute(“key”);
request 一次请求过程有效(forward)
session 可以跨越多次请求,用户唯一。
servletContext(application) 全局共享,整个web应用只有一个。
2. 能够操作所有作用域。
3. 存
setAttribute(“key” Value, 决定数据存入哪个作用域);
参数3可选值:
PageContext.REQUEST_SCOPE
PageContext.SESSION_SCOPE
PageContext.APPLICATION_SCOPE

getAttribute(“key”,int获取哪个作用域中的值 )
参数2可选值:
PageContext.REQUEST_SCOPE
PageContext.SESSION_SCOPE
PageContext.APPLICATION_SCOPE
3. 获得其他8个隐含对象
语法: pageContext.getXxxxx();
比如: pageContext.getRequest();
注意
1. 9个隐含对象只能在java脚本中使用。
2. 隐含对象其实就是翻译后的servlet中的service方法局部变量
3. 不能再声明脚本中使用。
总结重点
1. 记住JSP的执行原理和翻译原理
2. 记住9个隐含对象
3. 掌握在jsp从request作用域获取值,并展示

1.JSP 翻译规则
jsp servlet
<%=java表达式%> out.println(java表达式)
<%!声明的java代码%> servlet类的内部和方法外部的代码(属性、方法)
<%一般的java代码%> Servlet类的service方法内部的代码。
html标签 out.println(html标签)
2. jsp设置编码
<%@page pageEncoding=’UTF-8’ contentType=’text/html;charset=utf-8’%>
3. JSP的9大内置对象(隐含对象)
exception Exception
request HttpServletRequest
response HttpServletResponse
session HttpSession
application ServletContext
pageContext PageContext(能获得其他8个隐含对象、作用域、操作其他所有作用域)
out PrintWriter(JspWriter)
page this
config ServletConfig

JSP

EL (Expression Language)
替换jsp中表达式脚本
作用: 将表达式计算并将结果输出给浏览器。
语法:EL使paramrequestScoperequestsessionScopeapplicationScopepageContextcookie1.:url?msg=1234EL:{param.请求参数名字}
2. 获得request作用域中的值
requestScope.name3.{对象.属性名}
原理: EL访问对象属性时,依然使用对象的get属性()方法获取值
属性 name 对应的get方法: getName() (方法名就是属性名前面加get同时属性名首
字母大写)
4. 获得session作用域中的值
sessionScope.name5.servletContext{applicationScope.命名属性的name}
6. pageContext的使用
能够获得其他8个jsp的隐含对象
获得 “/项目名”
Java脚本: <%=request.getContextPath()%>
EL: pageContext.request.contextPathcss使//,:{pageContext.request.contextPath}/资源路径”
7. 访问list中的数据
[]8.访Map(key){map集合.key}
9. 访问cookie中名字为JSESSIONID的cookie的value
${cookie.JSESSIONID.value}
10. 运算符
+ - * / % == != > < >= <=
补充:超链接传递数据问题
1. 请求参数

….

注意: : 请求参数传递和接受本质是一个字符串。
2. url超链接携带特殊字符数据或者中文
resp.sendRedirect(req.getContextPath()+”/day2/args.jsp?msg=I am url msg!!!”);
问题描述:特殊字符串(汉字)通过超链接传递,代码执行错误。
解决: 对要传递的字符串进行 URLEncoder.encode(要传递字符串,”UTF­8”);
JSTL (jsp第三方标签库)
使用:
导入jstl标签库 <%@taglib uri=’标签库路径’ prefix=’前缀’%>
例如: <%@taglib uri=’http://java.sun.com/jsp/jstl/core’ prefix=’前缀’%>
前缀作用: 用来防止标签名重复, <前缀:标签名>
JSTL 常用标签
删除作用域标签

作用: 删除指定作用域中得数据。
var: 要删除得作用域数据的name
scope: 删除哪个作用域中的数据(request,session,application)
单条件分支标签

//条件成立,才会执行

java:
if(条件){
//条件为true,才会执行
}
多条件分支标签


满足条件1的代码


满足条件2的代码


前面所有条件都不成立


java:
if(条件1){
满足条件1的代码
}else if(条件2){
满足条件2的代码
}else{
前面所有条件都不成立
}
遍历集合

//便var:items:step:1begin:end:varStatus:(index,count):varStatus=vs{vs.index}—–被便利元素的下标

${vs.count}—–对被遍历出来的元素排序(序号从1开始。)

java for-each:
for(每个当前对象 引用:遍历的集合){
//每次循环能够获得当前的对象。
}
日期格式化标签

value: 将要格式化的日期
pattern: 格式。 如:yyyy年MM月dd日
年 yyyy
月 MM
日期 dd
作业
1. 修改现有的JSP页面,将所有java脚本替换 EL+JSTL;
2. 完成商品管理系统中登录、注册、展示所有商品。

JSP+Servlet+JDBC开发中实战应用
1. DBUtils(链接数据库)
作用:获得数据库conn
注意: 导入数据库jar包 导入properties配置文件 修改DBUtils中配置文件路径
2. Entity(实体)
注意: 实体类­­表 属性­­表字段
3. DAO(数据访问对象)
// 发送对应的SQL语句到数据库中
Connection conn = null;
PreparedStatment pstm = null;
ResultSet rs = null;
try{
//1. 获得数据库conn
//2. 创建发送SQL语句的工具对象 pstm
//3. 发送SQL(绑定sql语句中? 值)
//4. 处理结果集.
}catch(Exception e){
throws new RuntimeException(e);
}finally{
//5. 释放资源(除了conn)
}
4. Service(控制事务+调用DAO)[一个方法对应一个独立的业务功能]
Connection conn = null;
try{
1. 开启事务
2. 调用dao
3. 事务回滚。
}catch(Exception e){
throws new RuntimeException(e);
}finally{
//5. 释放资源(conn)
}
5. Action
//1. 获得请求参数(收集页面中传递数据)
request.setCharacterEncoding(“UTF-8”);
String value = request.getParameter(“请求参数的name”);
//2. 调用service。
//3. 根据service执行结果,判断,控制跳转页面。
//重定向
response.sendRedirect(目标程序的uri);
//请求转发
request.setAttribute(“name”,Value);
request.getRequestDispatcher(目标程序的url-pattern).forward(req,resp);
6. JSP
EL+JSTL
EL
获得request作用域中的值 requestScope.session{sessionScope.命名属性的名字}
访问对象的属性 ${对象.属性名}
JSTL
遍历 forEach标签
判断 if标签。
删除作用域中的值: remove标签。
注意
1. 项目开发开始,需要将整个前端的页面资源全部拷贝webroot目录下
2. JSP中资源路径全部使用URI /项目名/相对于webroot的路径
3. 写代码要规范, 要单个测试。