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、<!--client能够看到的凝视-->
b、<%--client看不到的凝视%>
基本上上面的这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等框架我会在以后再介绍。