三指三大指令,六指六个动作 九指九个内置对应 ,十一个隐藏对象
一。jsp介绍
j s p java server pages! 一种动态的页面技术!本质是Servlet
jsp = java+html
二。jsp使用策略
html --》 就是单纯的页面 不涉及一点java代码!
servlet --》处理业务逻辑
jsp --> 有html 又需要java代码!
index.jsp --> html
deal.jsp --> servlet
success.jsp --> jsp
jsp内部结构!jsp如何实现java代码html混淆!jsp本质就是servlet!
1.service
包含java代码!
html out.print() 写到页面
2.jsp
java代码通过特殊的标签 不编译!直接添加到service
html代码会直接写出 out
3.jsp本质 servlet
jsp --> xx_jsp.java --> HttpJspBase extends HttpServlet --
jsp --> Servlet
jsp --> java --> class
思考: servlet java 和 html
service()
java
html
java
html
三。jsp的基本语法
1.jsp添加注释
<!-- 网页注释 --> 页面查看源码可以看见
<%-- jsp的注释 --%> 看不见 安全 流量
2.添加java代码
<%
java代码
此处代码会被编译到 service方法中!
不能声明方法!不能使用 static
其他代码块互相调用的时候注意先后顺序
%>
3.声明全局变量/方法
<%!
全局的
%>
4.<%=xx %> 写到页面
out.print(xx)
四。jsp的三个指令
指令是控制jsp页面的整体性质!
编码格式
内置对象等等
1.指令的引入方式!
<%@ 指令的名称
2.三大指令介绍
page 负责jsp页面的整体配置
include 动态包含
taglib 引入jstl包! 引入第三方包!
3.page
负责jsp页面的整体配置
1.language="java" jsp 编译后的语言! 只有java
2.import 导java的包!
-
<%@page import="包路径1,包路径2,....."
--
<%@page import="包路径1"
<%@page import="包路径1"
3.session
默认是true 自动创建session
false不创建了!
4.autoFlush="true"
自动刷新
5.jsp error-page
指定jsp报错走错误页面!
web.xml
设置错误码
<error-page>
<error-code>500</error-code>
<location>/html/error.html</location>
</error-page>
设置具体的错误类型
<error-page>
<exception-type>java.lang.ArithmeticException</exception-type>
<location>/error.html</location>
</error-page>
6.isErrorPage
默认是false
没有exception
true exception
能获取错误信息 exception.getMessage();
7.isELIgnored
false -=-> 可以使用el表达式
8.pageEncoding="UTF-8"
jsp -- java - class
编译的格式! pageEncoding 能指定编译格式
设置response响应的编码格式!
设置编码格式 window - jsp
4.include包含 静态包含
<%@include file="1.jsp" %>
需要删除 删自己!
2 包含
1 被包含
<%@include 这种形式去包含! 不会编译被包含者!
只会把被包含者内写到包含着中!
动态和静态两种!优选选择静态!!
5.taglib
引入第三方包 jstl
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
五。jsp的六个动作
<jsp:include 包含!
包含者
被包含者
这种包含方式会将两个对象都会进行编译!动态包含!
<jsp:forward
<jsp:param
forward转发!
<jsp:forward page="result.jsp">
<jsp:param value="老王吧" name="name"/>
</jsp:forward>
注意:如果使用param传递参数! 防止中文乱码!
在他之前调用 request.setCharacterEncoding("UTF-8");
<jsp:useBean
<jsp:setProperty
<jsp:getProperty
<!-- 通过标签声明实体类对象
id 对象名字
class: 类的全路径 注意此处是反射 要求类无参数构造方法
-->
<jsp:useBean id="javabean" class="com.itqf.bean.JavaBean"></jsp:useBean>
<!--
name:操作属性的对象名字
propery:属性名
value:设置的属性值
-->
<jsp:setProperty property="name" name="javabean" value="小老五啊啊啊"/>
<!--
name:操作属性的对象名字
propery:属性名 -->
<jsp:getProperty property="name" name="javabean"/>
jsp = java + html
编程思想:
java:万物皆对象
前段:万物皆标签
六。jsp的九个内置对应 ****
jsp中 Java代码直接可以使用!
<% %>
out PrintWriter
request HttpServletRequest
response HttpServletResponse
session HttpSession
execption Execption
application ServletContext
config ServletConfig
page page是this Object
pageContext 新的共享域
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
pageContext:
web四个共享域
servletContext 整个项目
session 一次会话
request 一次请求 或者一次转发
pageContext service方法中
pageContext:作为共享域 还没有局部变量好使!
操作自己数据: 没意义
setAttribute(name,object);
removeAttribute(name,object);
getAttribute(name,object);
操作别共享域的属性:
获取和添加:
setAttribute(name,object,int Scope);
removeAttribute(name,int);
getAttribute(name,int);
Scope:
APPLICATION_SCOPE 4
SESSION_SCOPE 3
REQUSET_SCOPE 2
PAGE_SCOPE 1
findAttribute(name)
会根据属性名 直接去四个域找到合适!
如果四个域中有重名!
从小的开始找!
七. el表达式
${req }
el 语法 ${域的属性的名字 }
==
pageContext.findAttribute(域的属性的名字 )
优势:简化输出!
1.输出四个域的内容
${属性名 } 四个域! 从小到大
2.直接输出 或 输出简单的数学运算
${"我爱你中国啊啊啊" }
${1==1 }
3.属性导航 属性调用
class Student{
private String name;
private Xifu xifu;
class Xifu{
private String name;
}
}
student.name
student.xifu.name
1.对象
${属性名.属性名 }
${属性名.方法 }
属性名 调用的是get方法获取数据!
如果域中保存的是对象!那么可以直接.属性获取值!
注意:类中应该有get方法!
2.list
属性名[index]
属性名.get(index)
3.list 里面放对象
4.map
属性名.get(key)
属性名.key的值
属性名['key值']
5.list -- map -- String 对象
4.表达式
empty
${empty 属性名/具体值}
${!empty 属性名/具体值}
String "xxx" --> false
"" --> true
Object 对象new了 就不为空
List 内部有数据 不为null
没有数据为null
Map 有数据不为null
没有数据为null
三元运算符
三元运算符
${1!=1? "true":"false"}
<input type="radio" name="is" ${empty usernam?"":"checked=checked" } />
11个隐藏对象!!! el
${name } --> 四个域中找! 从小到大
我想取 请求参数!
我想取cookie的值!取不了!
pageContext -- request -- getContextPath
${pageContext.request.contextPath } == /项目名
jsp中 ${pageContext.request.contextPath } 获取项目名
pageScope
requestScope
sessionScope
applicationScope 指定域获取范围
param 提交表单数据 map
paramValues 提交的表单数据 多选框
header 获取请求头信息 ${header['请求头名字']}
headerValues 一个请求头对应多个数据
cookie map name cookie
${cookie.cookie的名字.value/name}
initParam web.xml中的全局变量
八. jstl表达式
el 简化输出
jstl 简化逻辑
判断 -->
循环 -->
1.需要利用指令导包
<%@ taglib uri prefix="c"
2.set out remove
<!-- set out remove -->
<c:set var="num" value="10" ></c:set>
<c:remove var="num"/>
<c:out value="${num }" default="aaa"></c:out>
3.if
<c:if test="值"></c:if>
1.字符串 true false
2.1==1 = true ${ }
4.choose
<c:choose>
<c:when test="${num>10 && num <20 }">
小白菜 vip1
</c:when>
<c:when test="${num>=20 }">
酸菜 vip2
</c:when>
</c:choose>
5.
var i 声明变量
begin 起始的值
end 结束的值
step 每步+多少
<c:forEach var="i" begin="0" end="${list.size()-1 }" step="1">
<img src="${list[i] }" alt="" title="" />
</c:forEach>
增强for循环
<c:forEach items="${list }" var="item" varStatus="vs">
<tr align="center" ${vs.index%2==0?"bgcolor='#fb5832'":"bgcolor='#ffffff'" }>
<td>${vs.index }</td>
<td>${item }</td>
<td>${vs.count }</td>
<td>${vs.first }</td>
<td>${vs.last }</td>
</tr>
</c:forEach>
jsp:
jsp 9内置对象
el表达式
jstl