技术jsp

来源:互联网 发布:中国8月信贷数据 编辑:程序博客网 时间:2024/04/28 07:09

基本概念:

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 "-//W3C//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 "-//W3C//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 "-//W3C//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 "-//W3C//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 "-//W3C//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 "-//W3C//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 "-//W3C//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 "-//W3C//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 "-//W3C//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 "-//W3C//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 "-//W3C//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类型