zoukankan      html  css  js  c++  java
  • 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、hibernatespring等框架我会在以后再介绍。

  • 相关阅读:
    python,生产环境安装
    neo4j 图数据库
    RNN系列
    机器学习关于AUC的理解整理
    fensorflow 安装报错 DEPENDENCY ERROR
    dubbo Failed to check the status of the service com.user.service.UserService. No provider available for the service
    使用hbase遇到的问题
    MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk
    gradle 安装
    jenkins 安装遇到的坑
  • 原文地址:https://www.cnblogs.com/guwei4037/p/5582993.html
Copyright © 2011-2022 走看看