当1个人在沉思的时候,他其实不是在闲着。有看得见的劳动,也有看不见的劳动。 —— 雨果
java server page 运行在服务器真个页面. ==> 本质就是servlet.
运行流程:
jsp =(第1次访问时)=> .java ==> .class ==> 运行
JSP中的脚本:
<% java内容 %> 该脚本包裹的代码会出现在 service方法中
<%=表达式 %> 该脚本用于输出内容.out.print();方法包裹输出内容.
<%! 内容 %>(了解): 该脚本包裹的内容会出现在类定义中.
代替 脚本 => 输出脚本 <%= %>
格式: ${表达式}
EL表达式可以在4个域中取数据 => 4个内置对象 applicationScope/requestScope/sessionScope/pageScope
从指定域取值: ${requestScope.name}<br>
${applicationScope.name}<br>
不指定域取值: ${name}<br> => 从小域到大域中查找.显示最早找到的.
分类
page属性包括在“<%@ page ”和“%>”
之间。
page 指令
include指令
taglib 指令
功能:
page : 描写页面的1些属性.
include: 静态包括指令
taglib : 导入标签指令
page : <%@ page language="java" import="java.util.*" pageEncoding="UTF⑻"%>
page指令用于指定页面1些基本属性.
language="java" 页面中使用的语言为java.
*import="java.util.*" 就是导包. 是所有属性中唯逐一个可以在页面中出现屡次的属性.
*pageEncoding="UTF⑻" 页面保存到硬盘编码.
*contentType="text/html; charset=UTF⑻" 发送给阅读器的编码 .
以上两个码表最好1致. 但是1般设置1个属性便可.另外1个属性自动设置.
autoFlush="true" 如果缓冲区装满是不是自动刷新到阅读器. 如果装满并没有选择自动刷新,那末会抛出异常.
buffer="8kb" 决定jsp输出缓冲区大小为8kb
errorPage="" 配置当前页面的毛病页面
isErrorPage="false" 指定当前页面是不是是1个毛病页面
开发中,我们可使用以下配置统1配置毛病页面 比上面的方式要省事:
<error-page>
<error-code>500</error-code>
<location>/page/B.jsp</location>
</error-page>
extends="" 决定当前jsp的父类是谁.父类必须是servlet的子类.
info="" getServletInfo 刚方法的返回值.
isELIgnored="false" 决定当前页面能否使用 EL表达式. 默许值就是支持el.
session="true" 当前jsp页面是不是可以直接使用session对象.默许值就是true.
<%@ include file=“filename” %>
<% String url="index.html" ; %>
<%@ include file = "<%= url %>" %>
<%@ include file = "jw.jsp?nm=browser" %>
比如
包括的是目标文件的源码;包括过来,1起翻译
main.jsp
<%
String s = “abc”;
%>
<%include file=“part.jsp” %>
part.jsp
<%=s %> 没有定义变量s
虽然part.jsp本身会有毛病
但是运行main.jsp就能够正确引入part.jsp
指的在jsp中不加以声明就能够直接使用的9个对象.
原理: 由于我们的代码是写在jsp对应java的service方法中的.所以在service方法中声明的变量,我们可以直接使用.
public void _jspService(HttpServletRequest 1>request, HttpServletResponse 2>response)
throws java.io.IOException, ServletException {
PageContext 3>pageContext = null;
HttpSession 4>session = null;
Throwable 5>exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
if (exception != null) {
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
ServletContext 6>application = null;
ServletConfig 7>config = null;
JspWriter 8>out = null;
Object 9>page = this;
*本身是1个域对象. 在pageContext对象上有1个map. 这个Map就是Page域.
操作: 4个操作.
范围: 就只在当前页面中有用.
作用: 在jsp中应避免在页面上书写任何java代码.
//pageContext.setAttribute(name, value);
// pageContext.getAttribute(name);
//pageContext.removeAttribute(name);
//pageContext.getAttributeNamesInScope(scope);
*pageContext对象还可以操作其他3个域
目的就是为了方便.
pageContext.setAttribute("name", "applicationTom",PageContext.APPLICATION_SCOPE );
pageContext.setAttribute("name", "sessionTom",PageContext.SESSION_SCOPE );
pageContext.setAttribute("name", "requestTom",PageContext.REQUEST_SCOPE );
//pageContext.getAttribute(name, scope);
//pageContext.removeAttribute(name, scope);
//pageContext.getAttributeNamesInScope(scope);
//pageContext.findAttribute("name") 会从所有域中查找键. 从小到大
*持有其他8个内置对象的援用.根据这个对象可以取得其他8个内置对象
pageContext.getRequest();
pageContext.getResponse();
pageContext.getSession();
pageContext.getServletContext();
pageContext.getException();
pageContext.getServletConfig();
pageContext.getOut();
pageContext.getPage();
out 对象是jsp当中的输出对象.
代码:
out.print("a");
response.getWriter().print("b");
out.print("c");
response.getWriter().print("d");
输出: bd ac
原理:
在输出到阅读器时,会先把两个流合并,再输出.
合并时response的字符流在前.
JSPWriter在后. 所以不管代码书写顺序如何.终究
response流的内容总会在JSPwriter流的内容之前
结论: 在jsp中输出使用out(JSPWriter)输出,不要使用response.getWriter输出.
JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以保护。
语法
<jsp:include page={"relativeURL" | "<%= expression %>"} />
<jsp:include page={"relativeURL" | "<%= expression %>"} >
<jsp:param name="PN"
value="{PV | <%= expression %>}" /> *
</jsp:include>
<jsp:useBean>
使用1个ID和1个给定作用范围和同1ID的JavaBean相干联
<jsp:setProperty>
设置JavaBean的属性值
<jsp:getProperty>
获得JavaBean的属性值
<jsp:include>
要求时文件包括
<jsp:forward>
接受用户输入并将要求分派给另外一页面
<jsp:param>
forward标签详解
</head>
<body>
<%-- JSP动作标签
分担jsp页面的java代码
--%>
<jsp:forward page="/index.jsp"></jsp:forward>
<%-- //下面的代码相当于上面的标签
request.getRequestDispatcher("/index.jsp").forward(request, response);
--%>
</body>
</html>
include标签详解
<body>
<%-- JSP动作标签
分担jsp页面的java代码
--%>
<jsp:include page="/index.jsp"></jsp:include>
<%--
// jsp 动态包括
request.getRequestDispatcher("/index.jsp").include(request, response);
--%>
</body>
<jsp:include>
与include指令的比较
<jsp:include>
标签是动态引入, <jsp:include>
标签触及到的2个JSP页面会被翻译成2个servlet,这2个servlet的内容在履行时进行合并。 <jsp:include>
标签,还是include指令,它们都会把两个JSP页面内容合并输出,所以这两个页面不要出现重复的HTML全局架构标签,否则输出给客户真个内容将会是1个格式混乱的HTML文档。 1.自定义转换器
public class MyDateConverter implements Converter {
//参数2 : 待转换的类型传递进来. => 2012⑴2⑴2
// 转换好以后,使用返回值返回 => Date对象
//参数1: 告知你要转换成甚么类型的
public Object convert(Class arg0, Object arg1) {
//创建格式化器
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
//使用格式化器将参数格式化成日期类型
try {
Date date = format.parse(arg1.toString());
//没出异常.就返回日期对象.
return date;
} catch (ParseException e) {
e.printStackTrace();
//出现异常返回null
return null;
}
}
}
2. 转换器注册
//注册我们自定义的转换器
//参数1 自定的转换器
//参数2 注册转换的类型
ConvertUtils.register(new MyDateConverter(), Date.class);
完成如上两步便可.
首先创建1个学生类
//javaBean
//1.要求为属性提供get/set方法任意之1
//2.需要有空参构造
//3.实现串行化接口(可选)
public class User {
private String name;
private String password;
private int age;
private Date hiredate;
public Date getHiredate() {
return hiredate;
}
public void setHiredate(Date hiredate) {
this.hiredate = hiredate;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [name=" + name + ", password=" + password + ", age=" + age
+ ", hiredate=" + hiredate + "]";
}
}
1个小Demo
public class AServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 创建User对象
User u = new User();
// 将表单参数封装到User对象
//参数1: 填写User对象
//参数2: 填写需要封装到User对象的参数Map
try {
//如果我们需要BeanUtils支持非8大基本数据类型.我们只要给BeanUtils添加类型转换器便可
//注意:注册类型转换器,必须写在populate方法之前.
ConvertUtils.register(new MyDateConverter(), Date.class);
//BeanUtils在封装时可以完成类型转换. 自动转换的范围 只限于 8个基本数据类型
BeanUtils.populate(u,request.getParameterMap());
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println(u);
/* //1 取得参数
String name = request.getParameter("name");
String password = request.getParameter("password");
//2 封装参数 User
User u = new User();
u.setName(name);
u.setPassword(password);*/
//-------------------------------------------------------
//3 将User对象交给业务类处理
//4 根据处理结果
//成功=>在session加入成功标识,并重定向到成功页面
//失败=>回到登录页面.提示毛病信息
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
用于代替,简化页面中的java代码.
Java standard Tag Library => java标准标签库
apache组织提供1套已开发好的标签库.
这套标签库在javaee 5.0版本后已纳入标准.(使用不需要导包)
该套标签库1共分为4个库:
core:核心库(用的最多的)****
fmt:格式化库(2个)
xml:xml的操作相干(废弃)
sql: 与数据库操作相干(废弃)
<%-- <c:if>(经常使用) 判断
test="${num1 > num2 }" 填写返回值为boolean的表达式
var="if" 键
scope="page" 域 将判断结果以var属性值为键放入该属性指定的域中.
--%>
<%
request.setAttribute("num1", 1000);
request.setAttribute("num2", 10000);
%>
<c:if test="${num1 > num2 }" var="if" scope="page" >
num1 利害!
</c:if>
${pageScope.if}
<hr>
if else
<%-- 判断标签.支持if else情势
<c:choose>
<c:when>
test: 填写返回值为boolean的表达式
<c:otherwise>
--%>
<c:choose>
<c:when test="${num1 > num2 }">
num1 利害!
</c:when>
<c:otherwise>
num2 利害!
</c:otherwise>
</c:choose>
<hr>
遍历标签
<%-- <c:forEach>(经常使用) 遍历标签
items="${requestScope.list}" 要便利的集合设置给该属性
var="abc" 每次遍历集合中元素 该属性值作为键放入page域
varStatus="st" 每次遍历的状态,会封装成1个对象 以该属性值为键 放入page域
数数的功能
begin="1" 从几开始数
end="100" 数到几
step="1" 每次数几个数
var="num" 将当前数的数以该属性值作为键放入page域
--%>
<%
List list = new ArrayList();
list.add("tom");
list.add("jerry");
list.add("jack");
list.add("rose");
request.setAttribute("list", list);
%>
<table border="1">
<tr>
<th>名称</th>
<th>是不是是集合中第1个元素</th>
<th>是不是是集合中最后1个元素</th>
<th>显示当前遍历的索引</th>
<th>显示当前遍历的计数</th>
</tr>
<c:forEach items="${requestScope.list}" var="abc" varStatus="st" >
<tr id="${st.index%2==0?"even":"odd"}" >
<td>${pageScope.abc}</td>
<td>${pageScope.st.first}</td>
<td>${pageScope.st.last}</td>
<td>${pageScope.st.index}</td>
<td>${pageScope.st.count}</td>
</tr>
</c:forEach>
</table>
<hr>
<!-- ----------------------------------------------------------------------- -->
<c:forEach begin="1" end="100" step="1" var="num" >
${num}
</c:forEach>
fmt库 格式化库
格式化日期
<!--
格式化日期
fmt:formatDate
-->
<fmt:formatDate value="<%=new Date() %>"
pattern="yyyy/MM/dd hh:mm:ss" var="date" scope="request" />
${requestScope.date}
格式化数字
<!--
格式化数字
fmt:formatNumber
-->
<fmt:formatNumber value="3.1415926" pattern="0000.00000000000" var="num1" scope="request" ></fmt:formatNumber>
<fmt:formatNumber value="3.1415926" pattern="####.###########" var="num2" scope="request" ></fmt:formatNumber>
${requestScope.num1}<br>
${requestScope.num2}<br>
路径总结
条件: 所有路径都应以”/”开头.
项目名:day10-jsp
资源名:AServlet
客户端路径 => 给阅读器用的路径 => 填写项目名称
<form action="/day10-jsp/AServlet" >
<img src="http://www.wfuyu.com/upload/caiji/20160922//day10-jsp/AServlet" >
<a href="/day10-jsp/AServlet" >
response.sendRedirect("/day10-jsp/AServlet")
服务器端路径 => 给服务器端使用的路径 => 填写项目下的路径
request.getRequestDispatcher("/AServlet")
errorPage="/AServlet"
<location>/AServlet</location>
上一篇 C++11学习
下一篇 Oracle分页查询性能优化