JSP作为Java Web开发中比较重要的技术,一般当作视图(View)的技术所使用,即用来展现页面。Servlet由于其本身不适合作为表现层技术,所以一般被当作控制器(Controller)所使用,而JavaBean作为模型(Model)层使用。这就是经典的MVC模型。

Servlet和JSP的关系上篇博客已经讲过了,并演示了一个相当简单的例子。在具体讲述JSP之前,先把JavaBean简单介绍一下。

JavaBean其实就是一个Java普通类,定义了类的属性和行为(get、set方法)。在MVC设计模式当中,并没有提及数据库交互操作,其实就是通过JavaBean实现具体的数据库操作的。至于为什么叫JavaBean,据说还有一个故事。Java之父在一次喝咖啡的时候看到桌子上的咖啡豆,突发奇想就给起了个JavaBean的名字(Bean是豆子的意思)。

提到MVC,顺便说一下三层(分层、多层)架构,很多人搞不清之间的关系,感觉MVC与三层架构非常相似,认为它们没有什么太大的区别。其实用一句话概括,MVC是设计模式,而三层架构是分层模型。MVC包含模型-控制器-视图,注意这里没有“层”,它强调的是将开发代码分为这几个部分,通过这种模型来实现应用程序的开发。MVC也不是Web开发的专属,其实在早期的C/S开发中已经用到了MVC设计模式。而三层架构指的是DAL(数据访问层)、BLL(业务逻辑层)、UI(用户界面层),它强调的是程序开发的结构。

理清上面的关系,利用Java语言就可以处理后台所有相关的操作,而使用JSP就可以处理前台页面所有相关的操作。

一、JSP基本元素

一个JSP包含以下基本元素:

1、html部分

就是指JSP(Java Server Pages,Java服务端页面)页面的静态部分。

2、指令

主要有如下3种指令:

page指令(每个JSP页面都需要有,设置页面编码,导入需要jar包都需要page指令):<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

taglib指令(导入JSTL或者自定义标签时使用):<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

include指令(包含页面):<%@include file="test.jsp" %>

3、表达式

<%=方法(参数...)%>

  1. <%=getTime() %>

4、脚本段(scriptlet)

格式:<%...%>。比如:

  1. <% Calendar c = Calendar.getInstance(); %>
  2. <%if (c.get(Calendar.AM_PM) == Calendar.AM) {%>
  3. 上午
  4. <%} else {%>
  5. 下午
  6. <%}%>

5、声明

格式:<%!...%> 比如:

  1. <%!public String getTime(){
  2. return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
  3. } %>

6、动作

使用JavaBean:<jsp:useBean id="..." class="包名.类名" scope="page"/>

获取属性:<jsp:getProperty property="Bean的属性名称" name="使用的Bean的ID" />

设置属性:<jsp:setProperty property="Bean的属性名称" name="使用的Bean的ID" value="为属性指定的显式值"/>

页面包含:<jsp:include page="test.jsp"/>

页面跳转:<jsp:forward page="test.jsp"/>

...

7、注释

分两种注释:

a、<!--客户端可以看到的注释-->

b、<%--客户端看不到的注释%>

基本上上面的这7个元素,稍微复杂一点的jsp页面都会包括。这里特别提及一下,include指令和include动作的区别,两者都可以在主页面中引入别的页面,达到嵌入页面的目的。主要区别在于include指令会影响主jsp页面的构造,对主页面定义的变量会有影响,本质上是跟主页面编译为一个新的页面,因此页面执行效率更高。而include动作是将新的页面嵌入到主页面当中,在执行时会先加载主jsp页面,再加载include动作嵌入的页面,执行效率比include指令低一点,但是这是更灵活的选择。实际开发中,使用include动作更多一点。

二、JSP隐式对象

隐式对象的含义就是指不需要显式new一个类的对象的对象,可以在JSP页面直接使用。主要有四类:

1、输入输出对象:request、response、out

request.getParameter("name");

request.getParameterValues("name");

response.setContentType("text/html;charset=gbk");

response.sendRedirect("url");

out.println("...");

2、作用域对象:pageContext、request、session、appplication

pageContext.getAttribute("name");

pageContext.setAttribute("name","value");

request.getAttribute("name","value");

request.setAttribute("name","value");

session.getAttribute("name");

session.setAttribute("name","value");

application.getAttribute("name");

application.setAttribute("name","value");

作用域对象的生命周期:pageContext(页面)<request(请求)<session(会话)<application(应用)。

3、Servlet对象:page、config

((HttpJspPage)page).getServletInfo();

config.getInitParameter("name");

4、错误对象:exception

exception.printStackTrace(out);

三、EL表达式(表达式语言)

虽然能够通过表达式在JSP页面嵌入Java代码实现结果输出,但是这并不是最好的开发方式。从开发角度来讲,前台JSP页面应该不出现Java代码(Java代码应该在后台出现)。为了解决这个问题,推出了JSP表达式语言。

语法:${...} 。

举个简单点的例子:

  1. <jsp:useBean id="bean" class="com.JspPractise.bean.City" scope="page"/>
  2. <jsp:setProperty property="name" name="bean" value="测试EL"/>
  3. ${bean.name}   or    ${bean["name"]}

通过jsp的useBean动作使用了某个JavaBean,再通过setProperty动作给name属性赋值,最后通过${bean.name}或者${bean["name"]}输出:测试EL。

再比如form表单提交:

我们可以使用<%=request.getParameter("name") %>输出结果,但是更好的方式是通过${param.name}来输出。由于该作用域为page,所以也可以通过${pageScope.bean.name}EL隐式对象输出。从作用域从小到大排序其它还有requestScope、sessionScope、applicationScope等各种EL隐式对象(区别于JSP隐式对象)。

此外,EL表达式还有运算功能,比如:

  1. ${10+1.0} <!-- 11.0 -->
  2. ${90E2-120} <!-- 8880.0 -->
  3. ${23.8*7} <!-- 166.6 -->
  4. ${1/0} <!-- Infinity  -->
  5. ${10 div 5} <!-- 2.0 -->
  6. ${10%4} <!-- 2 -->
  7. ${10 mod 4} <!-- 2 -->
  8. ${10*10 eq 100} <!-- true -->
  9. ${'c' gt 'b'} <!-- true -->
  10. ${9 le 8} <!-- false-->

四、JSTL(Java标准标签库)

JSTL也是JSP页面中使用的技术,这套标签库设置的目的就是在JSP页面中面对一些判断(条件标签:if)、循环(迭代标签:foreach)、数据库操作(SQL标签库:update、param、query等)操作的时候,总不可避免的要嵌入Java代码,而使用这些标签则让JSP页面代码“清爽”了许多。除了上面的这些标签之外,还有一些通用标签,比如:set、remove、out等。

使用JSTL,首先要使用taglib指令,导入JSTL。

  1. <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

导入之后就可以在JSP页面中使用JSTL了。

下面用JSTL将上面的输出“上午/下午”的嵌入Java代码的例子,改用JSTL实现。

  1. <c:set var="cc" value="<%=Calendar.getInstance().get(Calendar.AM_PM)%>" />
  2. <c:set var="pm" value="<%=Calendar.PM%>" />
  3. <c:set var="am" value="<%=Calendar.AM%>" />
  4. <c:if test="${cc==am}">
  5. <c:out value="上午"></c:out>
  6. </c:if>
  7. <c:if test="${cc==pm}">
  8. <c:out value="下午"></c:out>
  9. </c:if>

除了value里面的代码是Java代码之外(这里为了简单演示没有将Java代码存放到后台代码中去),再也看不到Java的身影了,取而代之的是JSTL。
再看看foreach标签如何使用。

  1. <%
  2. String[] colors = new String[] { "red", "green", "yellow", "black","silver" };
  3. pageContext.setAttribute("colors", colors);
  4. %>
  5. <c:forEach var="color" items="${pageScope.colors}">
  6. <c:if test="${color=='yellow'}">
  7. <c:out value="${color}" />
  8. </c:if>
  9. </c:forEach>

将一个String数组存放到了pageContext(JSP作用域对象)当中,然后通过JSTL结合EL表达式pageScope(EL作用域对象)取出并循环输出。

JSTL还提供了SQL标签库,由于我们开发一般都会在后台封装这部分代码,所以基本上用不着,这里也就不再演示。

本篇博客主要回顾了JSP开发过程中的很多基础性的细节知识,熟练掌握以上知识就能够进行Java Web开发了。当然随着项目规模的越来越大,单纯的JSP开发也不能够胜任,需要引入开发框架。著名的struts、hibernatespring等框架我会在以后再介绍。

Java Web开发之详解JSP的更多相关文章

  1. 《Tomcat与Java Web开发技术详解》思维导图

    越想构建上层建筑,就越觉得底层基础很重要.补课系列. 书是良心书,就是太基础了,正适合补课. [纯文字版] Tomcat与Java Web开发技术详解 Servlet Servlet的生命周期 初始化 ...

  2. 《TomCat与Java Web开发技术详解》(第二版) 第六章节的学习总结 ---- JSP技术

    第六章主要介绍了JSP的相关知识. 1.JSP:是通过在HTML文件中加入java程序片段(Java Scriptlet)和JSP标记,就构成了JSP文件.JSP实质上是Servlet.JSP的API ...

  3. 《TomCat与Java Web开发技术详解》(第二版) 第八章节的学习总结 -- 访问mysql

    终于学到如何访问Mysql了 1. 可以看看此章节提供的sql脚本,以后可以照着写了.此外,对于Mysql如何使用,最好的地方就是其官网介绍了.http://dev.mysql.com/doc/ref ...

  4. 《TomCat与Java Web开发技术详解》(第二版) 第四章节的学习总结--常用Servlet API

    要开发Servlet,自然要掌握常用的servlet的相关API.通过此章节的学习,了解到如下常用API 1.Servlet接口--->GenericServlet抽象类(实现Servlet接口 ...

  5. 《TomCat与Java Web开发技术详解》(第二版) 第一章节的学习总结--HTTP组成+基本访问方式

    1.需要看懂HTML文件中的组成元素的基本含义.不同的组成元素,可以使得HTML支持文本,图片(img,将图片发给客户端),静态音频/视频(embed src,将音频视频发给客户端),超链接(href ...

  6. 《TomCat与Java Web开发技术详解》(第二版) 第六章节对应CD附带的helloapp无法启动的问题解决

    首先记录一下如何解决此章节CD中附带的helloapp无法启动的问题 我用的tomcat版本是:7.0.47:为了便于控制,针对此章节的helloapp,我在tomcat/conf/Catalina/ ...

  7. 《TomCat与Java Web开发技术详解》(第二版) 第五章节的学习总结 ---- Servlet的高级用法

    这一章节主要是介绍了Servlet技术的一些高级用法,如下是我自己的整理归纳 1.下载文件:即获取服务器文件,并把文件写入反馈给客户端 ServletContext.getResourceAsStre ...

  8. 《TomCat与Java Web开发技术详解》(第二版) 第三章节的学习总结--利用Context元素来自定义web应用的存储位置

    在学习完第三章后(第三章提供的web应用是helloaapp,我将其放到了tomcat/webapps中),对Context元素的作用理解不深:但是当进入第四章后,发现第四章提供的源码包中也有一个叫h ...

  9. java web.xml配置详解(转)

    源出处:java web.xml配置详解 1.常规配置:每一个站的WEB-INF下都有一个web.xml的设定文件,它提供了我们站台的配置设定. web.xml定义: .站台的名称和说明 .针对环境参 ...

随机推荐

  1. 使用 Windows 窗体 TextBox 控件创建密码文本框

    密码框是一种 Windows 窗体文本框,它在用户键入字符串时显示占位符. 创建密码文本框 将 TextBox 控件的 PasswordChar 属性设置为某个特定字符. PasswordChar 属 ...

  2. JFinal之学习资源

    JFinal官网: http://www.jfinal.com/ JFinal在线API: http://tool.oschina.net/apidocs/apidoc?api=jfinal JFin ...

  3. 期望-pku-oj-1055:Tree

    题目链接: http://poj.openjudge.cn/practice/1055/ 题目意思: 给出的树最大节点个数为n的情况下,求树上点深度的期望. 解题思路: 数学期望公式的推导. 自己先画 ...

  4. PAT 1006

    1006. Sign In and Sign Out (25) At the beginning of every day, the first person who signs in the com ...

  5. VS2012 编译GDAL

    先安装VS 2012, 然后下载GDAL最新版本代码,解压. 用管理员权限打开Developer Command Prompt for VS2012终端,进入代码目录. 然后运行命令: nmake / ...

  6. 内网架设SVN服务器相关设置

    环境说明:        外网IP为静态IP,工作室内有多台电脑,公用一台路由器.想要在某台电脑上架设SVN服务器,方便团队开. 解决方案: 一.准备工作1.获取 Subversion 服务器程序到官 ...

  7. C# 之 OpenFileDialog的使用

    一.打开文件对话框(OpenFileDialog) 1. OpenFileDialog控件有以下基本属性 [1]InitialDirectory:对话框的初始目录 [2]Filter:要在对话框中显示 ...

  8. SerialPort基本小例

    SerialPort是用于串口通信的控件与VB6中的MSCOMM控件相似,使用很方便... vb.net CodeImports System.IO.PortsImports System.TextP ...

  9. OVS操作总结

    转载:http://www.aboutyun.com/thread-11777-1-1.html Open vSwitch(下面简称为 OVS)是由 Nicira Networks 主导的,运行在虚拟 ...

  10. 最小生成树------Prim算法

    定义:设G=(V,E)是一个无向连通图.如果G的生成子图T=(V,E’)是一棵树,则称T是G的一棵生成树(Spanning Tree). 应用生成树可以得到关于一个电网的一组独立的回路方程.第一步是要 ...