Java Web开发之详解JSP
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、表达式
<%=方法(参数...)%>
- <%=getTime() %>
4、脚本段(scriptlet)
格式:<%...%>。比如:
- <% Calendar c = Calendar.getInstance(); %>
- <%if (c.get(Calendar.AM_PM) == Calendar.AM) {%>
- 上午
- <%} else {%>
- 下午
- <%}%>
5、声明
格式:<%!...%> 比如:
- <%!public String getTime(){
- return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
- } %>
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表达式语言。
语法:${...} 。
举个简单点的例子:
- <jsp:useBean id="bean" class="com.JspPractise.bean.City" scope="page"/>
- <jsp:setProperty property="name" name="bean" value="测试EL"/>
- ${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表达式还有运算功能,比如:
- ${10+1.0} <!-- 11.0 -->
- ${90E2-120} <!-- 8880.0 -->
- ${23.8*7} <!-- 166.6 -->
- ${1/0} <!-- Infinity -->
- ${10 div 5} <!-- 2.0 -->
- ${10%4} <!-- 2 -->
- ${10 mod 4} <!-- 2 -->
- ${10*10 eq 100} <!-- true -->
- ${'c' gt 'b'} <!-- true -->
- ${9 le 8} <!-- false-->
四、JSTL(Java标准标签库)
JSTL也是JSP页面中使用的技术,这套标签库设置的目的就是在JSP页面中面对一些判断(条件标签:if)、循环(迭代标签:foreach)、数据库操作(SQL标签库:update、param、query等)操作的时候,总不可避免的要嵌入Java代码,而使用这些标签则让JSP页面代码“清爽”了许多。除了上面的这些标签之外,还有一些通用标签,比如:set、remove、out等。
使用JSTL,首先要使用taglib指令,导入JSTL。
- <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
导入之后就可以在JSP页面中使用JSTL了。
下面用JSTL将上面的输出“上午/下午”的嵌入Java代码的例子,改用JSTL实现。
- <c:set var="cc" value="<%=Calendar.getInstance().get(Calendar.AM_PM)%>" />
- <c:set var="pm" value="<%=Calendar.PM%>" />
- <c:set var="am" value="<%=Calendar.AM%>" />
- <c:if test="${cc==am}">
- <c:out value="上午"></c:out>
- </c:if>
- <c:if test="${cc==pm}">
- <c:out value="下午"></c:out>
- </c:if>
除了value里面的代码是Java代码之外(这里为了简单演示没有将Java代码存放到后台代码中去),再也看不到Java的身影了,取而代之的是JSTL。
再看看foreach标签如何使用。
- <%
- String[] colors = new String[] { "red", "green", "yellow", "black","silver" };
- pageContext.setAttribute("colors", colors);
- %>
- <c:forEach var="color" items="${pageScope.colors}">
- <c:if test="${color=='yellow'}">
- <c:out value="${color}" />
- </c:if>
- </c:forEach>
将一个String数组存放到了pageContext(JSP作用域对象)当中,然后通过JSTL结合EL表达式pageScope(EL作用域对象)取出并循环输出。
JSTL还提供了SQL标签库,由于我们开发一般都会在后台封装这部分代码,所以基本上用不着,这里也就不再演示。
本篇博客主要回顾了JSP开发过程中的很多基础性的细节知识,熟练掌握以上知识就能够进行Java Web开发了。当然随着项目规模的越来越大,单纯的JSP开发也不能够胜任,需要引入开发框架。著名的struts、hibernate、spring等框架我会在以后再介绍。
Java Web开发之详解JSP的更多相关文章
- 《Tomcat与Java Web开发技术详解》思维导图
越想构建上层建筑,就越觉得底层基础很重要.补课系列. 书是良心书,就是太基础了,正适合补课. [纯文字版] Tomcat与Java Web开发技术详解 Servlet Servlet的生命周期 初始化 ...
- 《TomCat与Java Web开发技术详解》(第二版) 第六章节的学习总结 ---- JSP技术
第六章主要介绍了JSP的相关知识. 1.JSP:是通过在HTML文件中加入java程序片段(Java Scriptlet)和JSP标记,就构成了JSP文件.JSP实质上是Servlet.JSP的API ...
- 《TomCat与Java Web开发技术详解》(第二版) 第八章节的学习总结 -- 访问mysql
终于学到如何访问Mysql了 1. 可以看看此章节提供的sql脚本,以后可以照着写了.此外,对于Mysql如何使用,最好的地方就是其官网介绍了.http://dev.mysql.com/doc/ref ...
- 《TomCat与Java Web开发技术详解》(第二版) 第四章节的学习总结--常用Servlet API
要开发Servlet,自然要掌握常用的servlet的相关API.通过此章节的学习,了解到如下常用API 1.Servlet接口--->GenericServlet抽象类(实现Servlet接口 ...
- 《TomCat与Java Web开发技术详解》(第二版) 第一章节的学习总结--HTTP组成+基本访问方式
1.需要看懂HTML文件中的组成元素的基本含义.不同的组成元素,可以使得HTML支持文本,图片(img,将图片发给客户端),静态音频/视频(embed src,将音频视频发给客户端),超链接(href ...
- 《TomCat与Java Web开发技术详解》(第二版) 第六章节对应CD附带的helloapp无法启动的问题解决
首先记录一下如何解决此章节CD中附带的helloapp无法启动的问题 我用的tomcat版本是:7.0.47:为了便于控制,针对此章节的helloapp,我在tomcat/conf/Catalina/ ...
- 《TomCat与Java Web开发技术详解》(第二版) 第五章节的学习总结 ---- Servlet的高级用法
这一章节主要是介绍了Servlet技术的一些高级用法,如下是我自己的整理归纳 1.下载文件:即获取服务器文件,并把文件写入反馈给客户端 ServletContext.getResourceAsStre ...
- 《TomCat与Java Web开发技术详解》(第二版) 第三章节的学习总结--利用Context元素来自定义web应用的存储位置
在学习完第三章后(第三章提供的web应用是helloaapp,我将其放到了tomcat/webapps中),对Context元素的作用理解不深:但是当进入第四章后,发现第四章提供的源码包中也有一个叫h ...
- java web.xml配置详解(转)
源出处:java web.xml配置详解 1.常规配置:每一个站的WEB-INF下都有一个web.xml的设定文件,它提供了我们站台的配置设定. web.xml定义: .站台的名称和说明 .针对环境参 ...
随机推荐
- 【分享】4412开发板-嵌入式Linux开发须要掌握的基础知识和技能
本文转自迅为电子论坛:http://www.topeetboard.com 1.Linux 基础 安装Linux操作系统 Linux文件系统 Linux经常使用命令 Linux启动过程具体解释 熟悉L ...
- 【转】在XCode工程中创建bundle包
http://www.giser.net/?p=859 Bundle Programming Guide: https://developer.apple.com/library/ios/docume ...
- Cookie API
Cookie API All cookies created by the Nova framework are encrypted and signed with an authentication ...
- springMVC学习笔记三
十三.springMVC和spring集成 配置文件,spring的配置路径applicationContext.xml 在默认的web-inf下面 strut的配置文件默认在src下面 用了什么框架 ...
- 打造强大的BaseModel(1):让Model自我描述
前言 从事iOS开发已经两年了,从一无所知到现在能独立带领团队完成一系列APP的开发,网络上的大神给了我太多的帮助.他们无私地贡献自己的心得和经验,写出了一篇篇精美的文章.现在我也开始为大家贡献自己的 ...
- VIM7.3中文手册
INDEX *index.txt* For Vim version 7.3. 最近更新: 2010年7月 VIM 参考手册 by Bram Moolenaar 译者: Willis h ...
- Android_Menu_PopupMenu
layout.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" x ...
- Java获取 JVM 运行信息
import java.lang.management.ClassLoadingMXBean; import java.lang.management.ManagementFactory; impor ...
- mongodb学习相关网址
1.MongoDB官网 https://www.mongodb.org 2.MongoDB教程 http://www.yiibai.com/mongodb 3.MongoDB教程http://www. ...
- PullToRefresh的个性化扩展
一:实现区别下拉刷新和上拉加载 参考资料:http://blog.csdn.net/losetowin/article/details/18261389 在PullToRefresh的类库的com.h ...