JSP
基本概念:
1.什么是动态网页技术?
2.什么是客户端脚本语言?什么是服务器端脚本语言?
3.什么是jsp?
4.jsp的作用是什么?
5.工作原理
6.主要知识点
什么是动态网页技术:
以往我们使用html这样的语言显示给用户信息,这些显示的内容都是我们预先指定好的,没有和用户进行交流,例如:多个用户输入名字登陆后,我们需要显示他们的名字,这是动态技术,和用户进行交互后产生相应的结果,单靠html是不行的,再比如说,用户提交表单,服务器将信息存储到数据库里和数据库进行交流等
什么是客户端脚本语言?什么是服务器端脚本语言?
用来写在用户的浏览器执行的程序的语言是客户端脚本语言
用来写在服务器端执行的程序的语言是服务器端脚本语言
如果使用服务器端语言,好处在于可以降低用户浏览器的负荷,把重要的复杂的程序让服务器来执行
什么是jsp:
jsp好像服务器端脚本语言一样,他的程序是在服务器端执行的,是一种动态网页技术,jsp其实也就是servlet
jsp的作用是什么:
用于制作生成动态网页的,光用servlet+java是不方便的
工作原理:
请求—〉jsp—〉初始情况:1。翻译为.java文件(servlet类)2。已经编译好的servlet类—〉响应
初始情况:1。第一次请求 2。在上次请求后进行了修改,然后再请求
主要知识点:
1.基本概念
2.Jsp语法(语法格式,指令,动作,声明,代码段,表达式,内置对象)
3.Jsp的异常处理
4.JavaBean
5.自定义jsp标签
Jsp语法(语法格式)
<% %>:代码块,代码块中的变量是java中的service里的临时变量,这里不能写方法,因为在java中不支持方法嵌套
<%! %>:声明,声明中的变量和方法是java中的成员变量和方法
<%@ %>:指令
<%= %>:表达式
Jsp语法:指令
1.什么是指令?有什么用?
2.语法?
3.分类
什么是指令?有什么用?
用来设定和整个jsp页面相关的属性,例如:整个jsp页面的编码方式等,也叫页面指令
语法?
<%@ 指令名 属性=” vlaue ” %>
分类:
Page指令和include指令
Page指令:
<%@ page 属性1=值1 属性2=值2%>
属性:
Language:language=”java” 说明在jsp页面中使用的是java语言
Method:指定代码块中的方法名字,也就是jsp翻译好后,代码块默认对应的是service方法,通过这个属性可以修改为doGet,doPost
import:导入java类包
content_type:<%@page content_type=”text/html;charset=gbk”%>
session=”true|false”:指定jsp是否使用session
errorPage=”error_url”:当发生异常的时候,客户的响应被发送到哪个页面
isErrorPage=”true|false”:表示此页面是否为处理异常的页面
info:jsp页面的描述信息 getServletInfo可以得到描述信息
buffer=”kb”:最少1kb,jsp response的缓冲区
autoFlush=”true|false”:当buffer缓冲区满了会自动刷新输出
pageEncoding:中文编码问题
include指令:
<%@include file=url%>
包含,可以包含html,txt,jsp等
作用:代码重用
include指令的工作原理:
1.将包含的文件加入到一个文件中
2.翻译这一个文件
Jsp语法:动作
Include动作:
1.什么是?作用?
动作就是被封装好的一个功能,类似方法
包含动作,也是将一些文件包含到一个文件中
2.Include动作和include指令的区别?
工作原理不同:include动作的工作原理:各个文件分别翻译,最后包含者调用被包含文件翻译好的结果
3.语法:<jsp:include page=url> 也叫动态include
Forward动作:
<jsp forward page=url>流转
例1:显示星期 Date.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" import="java.util.*,java.text.*;"%>
<%
DateFormatSymbols date=new DateFormatSymbols(Locale.ENGLISH);
String[] d=date.getShortWeekdays();
%>
<!DOCTYPE html PUBLIC "-//W 3C //DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
for(int i=0;i<d.length;i++){
out.println("<h3>"+d[i]+"</h3>");
}
%>
</body>
</html>
例2:显示路径 getpath.jsp:
<%@ page language="java" contentType="text/html; charset=gbk"
pageEncoding="gbk" info="sdfsdf"%>
<!DOCTYPE html PUBLIC "-//W 3C //DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>Insert title here</title>
</head>
<body>
<h3>web应用的根路径<%=request.getContextPath() %></h3>
<h3>web应用的当前路径<%=request.getServletPath() %></h3>
<h3><%=request.getPathInfo() %></h3>
<h3><%=getServletInfo() %></h3>
<h3><%=page instanceof Servlet %></h3>
</body>
</html>
例3:include动作 include.jsp,header.jsp,footer.jsp
header.jsp:
<%@page import="java.util.*" contentType="text/html; charset=ISO-8859-1"%>
<%=request.getParameter("user")%>
<%
String [] v=request.getParameterValues("user");
out.println(v.length);
%>
footer.jsp:
footer
include.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W 3C //DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>
<jsp:include flush="true" page="header.jsp">
<jsp:param name="user" value="yuchen"/>
</jsp:include>
</title>
</head>
<body>
<H3><jsp:include flush="true" page="footer.jsp"></jsp:include></H3>
<h3><%=request.getParameter("user") %></h3>
</body>
</html>
例4:forward流转:forward,流转到上一个例子中的include.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W 3C //DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<jsp:forward page="include.jsp">
<jsp:param name="user" value="yuchen"/>
</jsp:forward>
</body>
</html>
猜数游戏:numberGuess.jsp
需求分析:
用户请求url,显示游戏页面,在文本框中输入1到100的整数,点提交,如果这个数和答案比大了,告诉用户再小点,否则提示再大些,如果正确,显示你答对了,并且显示猜的次数,能支持多人玩
程序的逻辑:
1.得到参数,判断参数是否为空
2.如果为空,说明用户第一次登陆,那么需要:生成一个答案(随机数),初始化猜的次数,用session保存这些信息,保证下一次请求这个页面的时候信息不丢失
3.如果不为空:说明用户输入了值,那么先得到session中保存的信息,然后判断这个值是否等于答案,并且次数加一,保存猜得次数到session中
4.如果等于答案,提示猜对了,并显示猜的次数
5.否则,判断大小,如果比答案大,提示用户小一些,如果比答案小,提示用户大一些
numberGuess.jsp:
<%@ page language="java" contentType="text/html; charset=gbk"
pageEncoding="gbk" import="java.util.*"%>
<!DOCTYPE html PUBLIC "-//W 3C //DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>Insert title here</title>
</head>
<body>
<%
int rst=0;
int count=0;
String guess=request.getParameter("result");
if(guess==null){
rst=Math.abs((new Random().nextInt())%100)+1;
count=0;
session.setAttribute("rst",new Integer(rst));
session.setAttribute("count",new Integer(count));
}else{
int intguess=Integer.parseInt(guess);
rst=((Integer)(session.getAttribute("rst"))).intValue();
count=((Integer)(session.getAttribute("count"))).intValue();
if(intguess==rst){
%><h2>正确</h2><p><%=count%></p><a href="numberGuess.jsp">再
玩一次</a>
<%
}else{
count++;
session.setAttribute("count",new Integer(count));
session.setAttribute("rst",new Integer(rst));
if(intguess>rst){
%><p>在小点</p><p><%=count%></p>
<%
}else if(intguess<rst){
%><p>再大点</p><p><%=count%></p>
<%
}
}
}
%>
<form action="numberGuess.jsp" method="get">
<tr align="center">
<td><input type="text" name="result" /></td>
</tr>
<tr align="center">
<td><input type="submit"/></td>
</tr>
</form>
</body>
</html>
发现问题:非常难度,numberGuess.jsp的代码很乱,如果能将业务逻辑分离出去就好些,我们使用javabean来写页面的逻辑
javabean:
1.什么是javabean?有什么用?
封装了jsp页面的业务逻辑,在jsp页面中可以非常方便的使用javabean
好处是jsp页面更加简洁,清晰
2.javabean的书写规则?
可序列化Serializable
属性有get,set方法
封装了页面的逻辑
可以重用
3.在jsp中使用javabean
第一种方式:传统方式:
先写javabean类:NumberGuessBean.java
package yuchen.guess;
import java.util.Random;
public class NumberGuessBean {
private int answer;//答案
private int numGuesses;//次数
private String hint;//大小
public NumberGuessBean(){
test();
}
public void setGuess(String guess){//判断结果
//虚拟属性
numGuesses++;
int g;
g=Integer.parseInt(guess);
if(g==answer){
hint="true";
}else if(g<answer){
hint="higer";
}else if(g>answer){
hint="lower";
}
}
public int getAnswer() {
return answer;
}
public String getHint() {
return hint;
}
public int getNumGuesses() {
return numGuesses;
}
public void test(){
answer = Math.abs(new Random().nextInt() % 100) + 1;
numGuesses =0;
this.hint="";
}
}
numberGuess2.jsp:
<%@ page language="java" contentType="text/html; charset=gbk"
pageEncoding="gbk" import="java.util.*,yuchen.guess.*"%>
<!DOCTYPE html PUBLIC "-//W 3C //DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>Insert title here</title>
</head>
<body>
<%
NumberGuessBean nb=null;
String guess=request.getParameter("result");
if(guess==null){
nb=new NumberGuessBean();
session.setAttribute("nb",nb);
}else{
nb=(NumberGuessBean)session.getAttribute("nb");
nb.setGuess(guess);
%><h2><%= nb.getHint()%></h2><p><%=nb.getNumGuesses()%></p>
<% if(nb.getHint().equals("true")){%>
<a href="numberGuess.jsp">再玩一次</a>
<%
} %>
<%
session.setAttribute("nb",nb);
}
%>
<form action="numberGuess2.jsp" method="get">
<tr align="center">
<td><input type="text" name="result" /></td>
</tr>
<tr align="center">
<td><input type="submit"/></td>
</tr>
</form>
</body>
</html>
可以看到使用javabean减少了jsp页面的逻辑代码,我们还能再减
第二种方式:使用jsp标签方式:
NumberGuessBean.java numberGuess3.jsp
numberGuess3.jsp:
<%@ page language="java" contentType="text/html; charset=gbk"
pageEncoding="gbk" import="java.util.*,yuchen.guess.*"%>
<!DOCTYPE html PUBLIC "-//W 3C //DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>Insert title here</title>
</head>
<body>
<jsp:useBean id="bean" class="yuchen.guess.NumberGuessBean" scope="session" />
<%
String guess=request.getParameter("guess");
if(guess!=null){
%> <jsp:setProperty name="bean" property="guess"/>
<%}
%>
<%
boolean including=true;
if("true".equals(bean.getHint())){
including=false;
%><p>你猜对了,你猜了</p> <jsp:getProperty name="bean"
property="numGuesses"/>
<a href="<%=response.encodeURL("numberGuess3.jsp") %>">再玩一次
</a>?<p>
<%
bean.test();}else if(bean.getNumGuesses()!=0)
{%>
<h2><jsp:getProperty name="bean" property="hint"/></h2>
<h2><jsp:getProperty name="bean" property="numGuesses"/></h2>
<%} %>
<%if(including) {%>
<form action="numberGuess3.jsp" method="get">
<tr align="center">
<td><input type="text" name="guess" /></td>
</tr>
<tr align="center">
<td><input type="submit"/></td>
</tr>
</form>
<%
}
%>
</body>
</html>
<jsp:setProperty name="bean" property="guess"/>:给虚拟属性赋值
bean.reset():如果猜对了,要重新初始化,以前的程序不用,因为<jsp:useBean id="bean"
class="numberguess.NumberGuessBean"
scope="session"/>的意思是:1.如果id中的引用在session中不存在,那么创建一个类的引用 2.如果存在可以依靠id找到session中的引用,以往的程序是参数为空便初始化,现在有了这句话就不用判断为空了,因为参数为空的时候他以前的id一直会在session中存在,但是这个时候需要把里面的内容重新初始化一下
Jsp的异常处理:
errorpage的作用?
在jsp中不建议处理异常,这样可以减少代码的复杂度,相同的异常不能集中处理,就是不能让调用这去
处理多个相同的异常,所以我们可以将异常的处理放到一个专门的页面中,这个页面就是errorpage
如何使用errorpage?
<%@page errorPage="x.jsp"%>:本页面的异常由那个页面来处理,要写在页面的前面
<%@page iserrorpage="true"%>:指名这个页面是异常处理页面
注意要有异常的处理
引例1:
jspSum.jsp:
<%@ page contentType="text/html; charset=GB2312" %>
<%@ page errorPage="errorpage.jsp" %>
<html><head><title>jspSum.jsp</title></head>
<body>
<%!
private int toInt(String num){
return Integer.valueOf(num).intValue();
}
%>
<%
int num1=toInt(request.getParameter("num1"));
int num2=toInt(request.getParameter("num2"));
%>
<p>
运算结果为:<%=num1%>+<%=num2%>=<%=(num1+num2)%>
</p>
</body></html>
error.jsp
<%@ page contentType="text/html; charset=GB2312" %>
<%@ page isErrorPage="true" %>
<%@ page import="java.io.PrintWriter" %>
<html><head><title>Error Page</title></head>
<body>
<p>
错误原因为:<% exception.printStackTrace(new PrintWriter(out));%>
</p>
</body></html>
将参数转换为整数,当输入的参数不是整数的时候,报异常,转向errorpage
通过web.xml使用errorpage:
<error-page>
<exception-type>java.lang.NumberFormatException|异常的某个类型</exception-type>
<location>/*.html|/*.jsp</location>
</error-page>
http的状态码的处理:
我们可以把状态码对应的错误页面替换掉,使得程序更加友好
使用web.xml
<error-page>
<error-code>404|要换得状态码</error-code>
<location>处理错误的页面路径</location>
</error-page>
追踪机制:
1.什么是追踪机制?有什么用?
我们都知道v层的页面有的时候会出现异常,这些异常我们是通过一个errorpage来进行处理的但是,如果访问很多的页面,每个页面都有可能发生异常,那么我们就会不知道到底是哪个页面产生的异常了,所以我们可以使用javabean来解决这个问题,直接追踪到问题的根源
2.引例:
我们可以写一个javabean用来存储页面的信息,比如说页面的url,然后写一个页面来使用javabean,这个页面抛出异常,当发生异常的时候去errorpage处理这个异常,在处理的时候打印是哪个页面产生的异常这里我们用到了隐藏的input,用来传递该页面的url
用户请求页面:可以计算除法
a.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W 3C //DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<form method="get" action="rst.jsp">
<input type="hidden" name="name" value="a.jsp"/>
除数:<input type="text" name="chushu" /><br>
被除数:<input type="text" name="beichushu" /><br>
<input type="submit" value="计算" />
</form>
</body>
</html>
b.jsp:可以做乘法
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ page errorPage="error.jsp" %>
<!DOCTYPE html PUBLIC "-//W 3C //DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<form method="get" action="rst.jsp">
<input type="hidden" name="name" value="b.jsp"/>
乘数:<input type="text" name="chengshu"/><br>
被乘数:<input type="text" name="beichengshu" />
<input type="submit" value="计算" />
</form>
</body>
</html>
javabean:用来做业务计算,并保存用户请求页面的url
package yuchen.errorpage.beanerror;
import java.io.*;
public class BeanError implements Serializable{
private String name;
private String chushu;
private String beichushu;
private String chengshu;
private String beichengshu;
private int rst;
public BeanError(){
}
public void setJisuan(){
if(chushu!=null){
int c=Integer.parseInt(chushu);
int b=Integer.parseInt(beichushu);
this.rst=c/b;
}else if(chengshu!=null){
int c=Integer.parseInt(chengshu);
int b=Integer.parseInt(beichengshu);
this.rst=c*b;
}
}
public String getBeichushu() {
return beichushu;
}
public void setBeichushu(String beichushu) {
this.beichushu = beichushu;
}
public String getChushu() {
return chushu;
}
public void setChushu(String chushu) {
this.chushu = chushu;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getRst() {
return rst;
}
public void setRst(int rst) {
this.rst = rst;
}
public String getBeichengshu() {
return beichengshu;
}
public void setBeichengshu(String beichengshu) {
this.beichengshu = beichengshu;
}
public String getChengshu() {
return chengshu;
}
public void setChengshu(String chengshu) {
this.chengshu = chengshu;
}
}
rst.jsp:计算结果显示页面,并可以抛出异常,使用javabean
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ page errorPage="errorbean.jsp" %>
<!DOCTYPE html PUBLIC "-//W 3C //DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<jsp:useBean id="be" class="yuchen.errorpage.beanerror.BeanError"
scope="request"></jsp:useBean>
<jsp:setProperty name="be" property="*" />
<%be.setJisuan(); %>
<hr>
结果:<input type="text" name="jieguo" value="<%=be.getRst()%>"/>
</body>
</html>
errorbean.jsp:异常处理页面,打印产生错误的页面url
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" import="java.io.*;"%>
<%@ page isErrorPage="true" %>
<!DOCTYPE html PUBLIC "-//W 3C //DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<%=exception.toString() %>
<%exception.printStackTrace(new PrintWriter(out)); %>
<hr>
<br>
<jsp:getProperty name="be" property="name" />
</body>
</html>
测试:a.jsp当输入除数为0,处理异常,显示a.jsp这个url; b.jsp当输入非数字,处理异常,显示b.jsp这个url,这样以来我们就知道是哪个页面发生的错误了
内置对象:
1.什么是内置对象?都有哪些内置对象?分别的意?有什么用?
不需要声明和获取的对象叫做内置对象,也叫jsp的隐含对象
2.pageContext:通过jsp工厂,得到这个对象,这个对象对这个环境进行初始化工作:page,response,request,errorpage,session
设置,buffer大小,autoflush设置
3.out:类型为jspWriter,这个是java.io.Writer的子类
4.application:ServletContext类型的对象
5.page:当前页面,相当于this,java.lang.Object类型
6.exception:java.lang.Throwable类型