Jsp详解
- 格式:docx
- 大小:569.95 KB
- 文档页数:32
第1章JSP技术简介JSP(Java Server Pages)技术是由Sun公司发布的用于开发动态Web应用的一项技术。
它以其简单易学、跨平台的特性,在众多动态Web应用程序设计语言中异军突起,在短短几年中已经形成了一套完整的规范,并广泛地应用于电子商务等各个领域中。
在国内,JSP 现在也得到了比较广泛的重视,得到了很好的发展,越来越多的动态网站开始采用JSP技术。
本章就对JSP及其相关技术进行简单的介绍。
1.1 认识HTTP协议HTTP协议(Hypertext Transfer Protocol,超文本传送协议)是WWW服务器使用的主要协议,对HTTP协议细节的基本理解是编写JSP或Java小程序的开发人员所必需的。
因此在学习JSP技术之前有必要更加仔细地研究一下HTTP消息的格式(这里的讨论源自HTTP/1.1协议规范。
参见规范2616,网址为/rfc/rfc2616.txt)。
HTTP 协议的关键部分有HTTP请求和HTTP响应,以及客户端Web程序设计的一些基础知识,在第4章4.4节将会具体介绍。
1.2 客户端Web程序设计介绍Web浏览器现已成为深受大多数用户喜爱的用户界面。
HTML语言提供了丰富的控件,第三方厂商提供了Visual Basic编写的数百个额外的控件,这些都使得Web浏览器独具特色。
虽然Web浏览器与传统的GUI界面有一定的差距,但它提供了一种独立而又简单的方法来访问分布式资源,尤其是Internet资源。
而且越来越多的客户端Web程序扩展技术变得更加成熟,出现了包括CSS、JavaScript、VBScript、动态HTML、Java1.1.Applet应用程序等技术在内的客户端Web程序设计技术,它们的相互结合使得Web程序更加迷人。
下面简单介绍几种常用的客户端Web程序设计技术的特点。
本书假定读者对这些技术都有一定的了解,不对这些技术作详细介绍。
1.2.1 CSSCSS(Cascading Style Sheets)称为层叠样式表,是动态HTML技术的一个部分,但可以和HTML结合使用。
详解JSP内置对象request常见⽤法request 对象是 HttpServletRequestWrapper 类的实例。
它的继承体系如下:_request 对象继承层次结构图.pngServletRequest 接⼝的唯⼀⼦接⼝是 HttpServletRequest ,HttpServletRequest 接⼝的唯⼀实现类HttpServletRequestWrapper ,单从 request 对象⼀脉单传的类继承体系可以看出,javaweb 标准类库只⽀持了 http 协议。
Servlet/JSP 中⼤量使⽤了接⼝⽽不是实现类,这恰恰就是⾯向接⼝编程的最佳应⽤啊。
request 内置对象是由 Tomcat 创建的,可以⽤来封装 HTTP 请求参数信息、进⾏属性值的传递以及完成服务端跳转,这就是request 对象最重要的三个功能了。
request 对象的创建流程⼀旦 http 请求报⽂发送到 Tomcat 中, Tomcat 对数据进⾏解析,就会⽴即创建 request 对象,并对参数赋值,然后将其传递给对应的 jsp/servlet 。
⼀旦请求结束,request 对象就会⽴即被销毁。
服务端跳转,因为仍然是同⼀次请求,所以这些页⾯会共享⼀个 request 对象。
1、访问请求参数<a href="login.jsp?name=张三&sex=man&id=" rel="external nofollow" >传递参数</a>login.jsp关键代码<%= "name:"+new String(request.getParameter("name").getBytes("ISO-8859-1"),"utf-8") %><br><%= "sex:"+request.getParameter("sex") %><br><%= "id:"+request.getParameter("id") %><br><%= "pwd:"+request.getParameter("pwd") %><br>说明:如果指定的参数不存在,将返回null;如果指定了参数名,但未指定参数值,将返回空的字符串"。
Jsp传递中文参数详解目前在jsp页面中传递中文参数,主要有两种方式:URL(GET)方式,例如:http://website/test1.jsp?act=add&type=桔子¶m=%20D%20BFORM(POST)方式,例如:<form name=test mehtod="post"><input type=hidden name=text2 value="中文"><input type=text name=text1><input type=submit value=submit></form>下面针对这两种情况,分别提供中文正确传递的解决方法方式1:URL方式例如:http://website/test1.jsp?act=add&type=桔子¶m=%20D%20B一般来说我们很少直接在URL里面把参数写成中文,如例子中的"type=桔子"这样传递。
如果出现这种情况,在我们的接收参数的页面我们只需要做个简单的转换就可以了。
代码test1.jsp:(主要部分)<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%String type = request.getParameter("type");String result = new String(type.getBytes("iso-8859-1"), "gb2312");out.println(result);%>还有更普遍的做法是对url中的中文字符进行编码,变成类似type=%20D%20B这样的字符。
JSP中的内置对象<j s p:f o r w a r d><jsp:forward>是把一个请求转发到另一个JSP或Servlet或者其他的静态资源(HTML)特点:被forward转发的资源必须与发出请求的页面处于相同的上下文环境中,每当遇到此标签时,容器就会停止执行当前的JSP,转而执行被转发的资源<j s p:p a r a m>l当使用<jsp:include>和<jsp:forward>标签引入或将请求转发给的资源是一个能动态执行的程序时,例如Servlet和JSP页面,那么,还可以使用<jsp:param>标签向这个程序传递参数信息。
l语法1:<jsp:include page="relativeURL | <%=expression%>"><jsp:param name="parameterName" value="parameterValue|<%= expression %>" /> </jsp:include>l语法2:<jsp:forward page="relativeURL | <%=expression%>"><jsp:param name="parameterName" value="parameterValue|<%= expression %>" /> </jsp:include>l<jsp:param>标签的name属性用于指定参数名,value属性用于指定参数值。
在<jsp:include>和<jsp:forward>标签中可以使用多个<jsp:param>标签来传递多个参数。
什么是jsp1、什么是jsp呢?实际上jsp就是⼀个servlet在html页⾯中嵌⼊我们的java脚本jsp的执⾏过程1、翻译阶段jsp在进⾏请求的时候会先被翻译成java⽂件2、编译阶段在将java⽂件编译成.class⽂件3、执⾏将处理之后的结果推送到我们的页⾯进⾏展⽰如果我们jsp页⾯第⼆次访问直接加载编译好的.class⽂件,如果说第⼆次加载整整个⽂件,它修改了会再次进⾏翻译,在编译在执⾏2、jsp页⾯元素组成1、page指令作⽤:设置内部的多个属性定义整个页⾯的属性设置的属性在整个页⾯都可以使⽤2、⼩脚本和表达式⼩脚本: <% ⼩脚本 ---java代码 %>表达式: <%= %> 你可以堪称是输出语句3、静态内容HTML静态⽂本4、指令:以“<%@ ” 开始,以“%> ” 结束5、声明 --⽅法的声明<%! ⽅法 %>6、注释<%-- 客户端不能查看到 --%>2、jsp中使⽤jdbc访问数据库需求:查询学⽣表信息展⽰到我们的jsp页⾯ jsp+jdbc 采⽤三层架构⽅式采⽤的是三层架构的格式1、将我们⽤的三层架构的包打出来2、编写我们的basedaoz直接将我们之前写好的basedao拿过来使⽤3、编写我们的实体对象(student)public class StudentEntity {private int stuId;private String stuName;private String gender;private int age;private Date birthday;private int studentNO;private int ClassID;private String city;private String email;public int getStuId() {return stuId;}public void setStuId(int stuId) {this.stuId = stuId;}public String getStuName() {return stuName;}public void setStuName(String stuName) {this.stuName = stuName;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public int getStudentNO() {return studentNO;}public void setStudentNO(int studentNO) {this.studentNO = studentNO;}public int getClassID() {return ClassID;}public void setClassID(int classID) {ClassID = classID;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}}4、编写dao层接⼝//查询学⽣表中所有信息public List<StudentEntity> getStuList(String sql);5、编写dao接⼝实现PreparedStatement pst = null;ResultSet rs = null;@Overridepublic List<StudentEntity> getStuList(String sql) {//声明⼀个最终返回的集合List<StudentEntity> stulist = new ArrayList<StudentEntity>(); //连接数据库Connection connection=BaseDao.getConnection();//执⾏sql--先产⽣⼀个PreparedStatementtry {pst = connection.prepareStatement(sql);rs = pst.executeQuery(); //拿到结果集while(rs.next()) {//声明⼀个学⽣对象StudentEntity student = new StudentEntity();student.setStuId(rs.getInt("stuId"));student.setStuName(rs.getString("stuName"));student.setAge(rs.getInt("age"));student.setCity(rs.getString("city"));stulist.add(student);//将对象添加到集合中}} catch (SQLException e) {e.printStackTrace();}return stulist;}6、编写service接⼝//查询student表所有信息public List<StudentEntity> findAll();7、编写service接⼝实现//实例化dao层对象StudentDaoImpl StudentDao = new StudentDaoImpl();@Overridepublic List<StudentEntity> findAll() {//编写查询sqlString sql = "select * from studentinfo";//调⽤dao层中的查询⽅法List<StudentEntity> userlist =StudentDao.getStuList(sql);return userlist;}8、编写jsp---stuinf.jsp将我们学⽣信息展⽰到页⾯中<%@page import="java.util.List"%><%@page import="com.dzqc.testStu.entity.StudentEntity"%><%@page import="com.dzqc.testStu.service.impl.StudentServiceImpl"%> <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body><table border="2" align = "center"><caption>学⽣信息列表</caption><tr><td>学号</td><td>姓名</td><td>年龄</td><td>城市</td></tr><!-- 读取业务层数据 --><%//实例化业务层对象StudentServiceImpl studentServiceImpl = new StudentServiceImpl();//调⽤查询学⽣多有的信息⽅法// List<StudentEntity> stulist =studentServiceImpl.findAll();List<StudentEntity> stulist = studentServiceImpl.findAll();for(int i = 0 ; i<stulist.size();i++){StudentEntity stu =stulist.get(i);%><tr><td><%=stu.getStuId() %></td><td><%=stu.getStuName() %></td><td><%=stu.getAge() %></td><td><%=stu.getCity() %></td></tr><%}%></table></body></html>。
Jsp:useBean使⽤详解<jsp:useBean>标签⽤来在jsp页⾯中创建⼀个Bean实例,定义语法如下:⼀、<jsp:useBean>语法<jsp:useBean id="id" scope="page|request|session|application" typeSpec/>⼆、<jsp:setProperty>语法<jsp:setProperty name="beanName" propertyDetail />其中,propertyDetail可以是以下中的⼀个: 1,property="*"2,property="propertyName" param="parameterName"3,property="propertyName"4,property="propertyName" value="property value"三、<jsp:getProperty>语法<jsp:getProperty name="beanName" property="propertyName"/>例:TestBean.javapackage com.jsp.ch3;public class TestBean {private String userName;private String password;private int age;public String getUserName() {return userName;}public void setUserName(String userName) {erName = userName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}} register.html<html><body><form action="register.jsp" method="post"><table><tr><td>姓名:<input type="text" name="userName"></td></tr><tr><td>密码:<input type="text" name="password"></td></tr><tr><td>年龄:<input type="text" name="age"></td></tr><tr><td><input type="submit"></td></tr></table></form></body></html>register.jsp<%@ page language="java" pageEncoding="gb2312"%><jsp:useBean id="user" scope="page" class="com.jsp.ch3.TestBean"/> <jsp:setProperty name="user" property="*"/>或者⽤以下,param可以不填写,其中param对应的是提交页⾯的表单name<jsp:setProperty property="userName" name="user" param="userName"/> <jsp:setProperty property="password" name="user" param="password"/> <jsp:setProperty property="age" name="user" param="age"/><html><body>注册成功:<br><hr>使⽤Bean的属性⽅法<br>⽤户名: <%=user.getUserName()%><br>密码: <%=user.getPassword()%><br>年龄: <%=user.getAge()%><br><hr>使⽤getProperty<br>⽤户名:<jsp:getProperty name="user" property="userName"/><br>密码: <jsp:getProperty name="user" property="password"/><br>年龄: <jsp:getProperty name="user" property="age"/>客户端名称:<%=request.getRemoteAddr() %></body></html>。
第1章JSP概述1.1什么是JSP网络通信中最常见的模式是B/S模式,即需要获取信息的用户使用浏览器向某个服务器发出请求,服务器进行必要的处理后,将有关信息发送给服务器。
在B/S模式中,服务器上必须有所谓的Web应用程序,这样的应用程序负责处理用户的请求,满足用户对信息的请求。
JSP是Web服务器端开发技术,利用这一技术可以建立安全、跨平台的Web应用程序。
JSP的安全性和跨平台得益于Java语言,这是因为Java语言具有不依赖于平台、面向对象和安全等优良特性,已经成为网络程序设计的佼佼者。
许多和Java有关的技术得到了广泛的应用和认可,JSP技术就是其中之一。
读者可能对Microsoft的ASP(Active Server Pages)比较熟悉,ASP也是一项Web服务器端的开发技术,可以开发出动态的、高性能的Web服务应用程序。
JSP和ASP技术非常相似。
ASP使用的是VBScript脚本语言,而JSP使用的是Java编程语言。
与ASP相比,JSP以Java技术为基础,又在许多方面做了改进,具有动态页面与静态页面分离、能够脱离硬件平台的束缚及编译后运行等优点,完全克服了ASP的脚本级执行的缺点。
JSP已经成为开发动态网站的主流技术。
需要强调的一点是:要想真正地掌握JSP技术,必须有较好的Java语言基础,以及HTML语言方面的知识。
1.2安装配置JSP运行环境JSP的核心内容就是编写JSP页面(有关JSP页面的内容见本章1.3节和第2章的2.1节)。
对于JSP页面,需要一个应用程序来运行它,我们将这样的应用程序称作JSP 引擎或JSP容器。
将安装JSP引擎的计算机称作一个支持JSP的Web服务器。
支持JSP 的Web服务器负责运行JSP,并将运行结果返回给用户,有关JSP的运行原理将在1.4节讲解。
自从JSP发布以后,出现了各式各样的JSP引擎。
1999年10月Sun公司将Java Server Page 1.1代码交给Apache组织,Apache组织对JSP进行了实用研究,并将这个服务器项目称为Tomcat。
Jsp详解1.简介2.Jsp的运行原理3.Jsp的语法1.Jsp模板元素2.Jsp中的脚本表达式3.Jsp中的脚本片段4.Jsp的声明5.Jsp注释6.Jsp指令1.首先我们来看一下page指令的用法2.下面在来看一下include指令3.最后来看一下taglib指令7.Jsp中内置的9个隐式对象8.JSP标签库1.jspinclude标签2.jspforward标签3.jspparam或者jspparams标签4.jspuseBean标签jspsetProperty标签jspgetProperty标签9.Jsp中怎么排查错误简介:JSP全称是JavaServer Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。
JSP这门技术的最大的特点在于,写jsp就像在写html,但:它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。
相比servlet而言,servlet很难对数据进行排版,而jsp除了可以用java代码产生动态数据的同时,也很容易对数据进行排版。
不管是JSP还是Servlet,虽然都可以用于开发动态web资源。
但由于这2门技术各自的特点,在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。
其原因为,程序的数据通常要美化后再输出:让jsp既用java代码产生动态数据,又做美化会导致页面难以维护。
让servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护。
因此最好的办法就是根据这两门技术的特点,让它们各自负责各的,servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示jsp来做。
Jsp的运行原理:目标:Web服务器是如何调用并执行一个jsp页面的?Jsp页面中的html排版标签是如何被发送到客户端的?Jsp页面中的java代码服务器是如何执行的?Web服务器在调用jsp时,会给jsp提供一些什么java对象?思考:JSP为什么可以像servlet一样,也可以叫做动态web资源的开发技术?其实Jsp就是一个Servlet,所以我们要先介绍Servlet的相关技术,当我们第一次访问Jsp 的时候,Jsp引擎都会将这个Jsp翻译成一个Servlet,这个文件存放在Tomcat中的work目录中,这里,我们新建一个MyJsp.jsp页面,然后访问以下,我们看一下翻译后的源码:1.<%@ page language="java"import="java.util.*"pageEncoding="utf-8"%>2.3.<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML4.01 Transitional//EN">4.<html>5.<head>6.7.<title>My JSP 'MyJsp.jsp' starting page</title>8.9.</head>10.11.<body>12. This is my JSP page. <br>13.</body>14.</html>1.package org.apache.jsp;2.3.import javax.servlet.*;4.import javax.servlet.http.*;5.import javax.servlet.jsp.*;6.import java.util.*;7.8.public final class MyJsp_jsp extends org.apache.jasper.runtime.HttpJspBase9.implements org.apache.jasper.runtime.JspSourceDependent {10.11.private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();12.13.private static java.util.List _jspx_dependants;14.15.private javax.el.ExpressionFactory _el_expressionfactory;16.private org.apache.AnnotationProcessor _jsp_annotationprocessor;17.18.public Object getDependants() {19.return _jspx_dependants;20. }21.22.public void _jspInit() {23. _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();24. _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class .getName());25. }26.27.public void _jspDestroy() {28. }29.30.public void _jspService(HttpServletRequest request, HttpServletResponse response)31.throws java.io.IOException, ServletException {32.33. PageContext pageContext = null;34. HttpSession session = null;35. ServletContext application = null;36. ServletConfig config = null;37. JspWriter out = null;38. Object page = this;39. JspWriter _jspx_out = null;40. PageContext _jspx_page_context = null;41.42.43.try {44. response.setContentType("text/html;charset=utf-8");45. pageContext = _jspxFactory.getPageContext(this, request, response,46.null, true, 8192, true);47. _jspx_page_context = pageContext;48. application = pageContext.getServletContext();49. config = pageContext.getServletConfig();50. session = pageContext.getSession();51. out = pageContext.getOut();52. _jspx_out = out;53.54. out.write("\r\n");55. out.write("\r\n");56. out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");57. out.write("<html>\r\n");58. out.write(" <head>\r\n");59. out.write(" \r\n");60. out.write(" <title>My JSP 'MyJsp.jsp' starting page</title>\r\n");61. out.write(" \r\n");62. out.write(" </head>\r\n");63. out.write(" \r\n");64. out.write(" <body>\r\n");65. out.write(" This is my JSP page. <br>\r\n");66. out.write(" </body>\r\n");67. out.write("</html>\r\n");68. } catch (Throwable t) {69.if (!(t instanceof SkipPageException)){70. out = _jspx_out;71.if (out != null && out.getBufferSize() != 0)72.try { out.clearBuffer(); } catch (java.io.IOException e) {}73.if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);74. }75. } finally {76. _jspxFactory.releasePageContext(_jspx_page_context);77. }78. }79.}我们看到,这个类继承了org.apache.jasper.runtime.HttpJspBase,要想看到这个类的源码,我1./*2. * Licensed to the Apache Software Foundation (ASF) under one or more3. * contributor license agreements. See the NOTICE file distributed with4. * this work for additional information regarding copyright ownership.5. * The ASF licenses this file to You under the Apache License, Version 2.06. * (the "License"); you may not use this file except in compliance with7. * the License. You may obtain a copy of the License at8. *9. * /licenses/LICENSE-2.010. *11. * Unless required by applicable law or agreed to in writing, software12. * distributed under the License is distributed on an "AS IS" BASIS,13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.14. * See the License for the specific language governing permissions and15. * limitations under the License.16. */17.18.package org.apache.jasper.runtime;19.20.import java.io.IOException;21.22.import javax.servlet.ServletConfig;23.import javax.servlet.ServletException;24.import javax.servlet.http.HttpServlet;25.import javax.servlet.http.HttpServletRequest;26.import javax.servlet.http.HttpServletResponse;27.import javax.servlet.jsp.HttpJspPage;28.import javax.servlet.jsp.JspFactory;29.30.import piler.Localizer;31.32./**33. * This is the super class of all JSP-generated servlets.34. *35. * @author Anil K. Vijendran36. */37.public abstract class HttpJspBase38.extends HttpServlet39.implements HttpJspPage40.41.42.{43.44.protected HttpJspBase() {45. }46.47.public final void init(ServletConfig config)48.throws ServletException49. {50.super.init(config);51. jspInit();52. _jspInit();53. }54.55.public String getServletInfo() {56.return Localizer.getMessage("");57. }58.59.public final void destroy() {60. jspDestroy();61. _jspDestroy();62. }63.64./**65. * Entry point into service.66. */67.public final void service(HttpServletRequest request, HttpServletResponse response)68.throws ServletException, IOException69. {70. _jspService(request, response);71. }72.73.public void jspInit() {74. }75.76.public void _jspInit() {77. }78.79.public void jspDestroy() {80. }81.82.protected void _jspDestroy() {83. }84.85.public abstract void _jspService(HttpServletRequest request,86. HttpServletResponse response)87.throws ServletException, IOException;88.}好吧,看到了,继承了HttpServlet类,所以说其实Jsp就是一个ServletJsp的语法:1.JSP模版元素2.JSP表达式3.JSP脚本片段4.JSP注释5.JSP指令6.JSP标签7.JSP内置对象8.如何查找JSP页面中的错误Jsp模板元素JSP页面中的HTML内容称之为JSP模版元素。