Java Web(JSP)

JSP是在HTML文档中嵌入java代码的技术,本质上是一个servlet类,因为在服务器端会被编译为一个servlet类来执行,相关HTML语句被编译为字符串形式执行,JSP出现的原因也就是在servlet中书写字符串类型的HTML语句繁琐且容易出错,而在jsp页面中HTML语句则可按照原来的规范书写,转换工作交由服务器端完成即可

jsp注释

<%-- --%>:jsp标准注释,不会被编译,不能通过查看源代码查看到
<!-- --!>:HTML注释,会被编译
<% %>:jsp代码
<%= %>:jsp输出
<%! %>:声明变量或方法,多个变量使用,分隔
<%/* */%>、<%// %>:多行注释、单行注释

编译指令

(包含在<%@ %>之间的部分)

page指令:用来定义JSP文件中的全局属性
Include指令:用来将指定位置上的资源包含在当前JSP文件中
taglib指令:当JSP页面中引用了用户自定义标签时,用来声明这些用户自定义标签的,用法:<%@taglib=”taglibURL”(唯一确定标签库的位置) prefix=”tagPerfix”(定义标签中的前缀字符串)%>

动作指令

<jsp:include>:用于在客户端请求时间内把静态或者动态的资源包含在JSP页面,包含的资源在page属性中用URL形式指定
用法:<jsp:include page=”fileName” flush=”true”>

<jsp:forward>:将请求转发到其他JSP页面、HTML页面或者servlet类
用法:<jsp:forward page=”url”/>

<jsp:param>:用于传递参数,为其他动作指令提供附加信息,和<jsp:include>、<jsp:forward>等指令一起使用
用法:<jsp:param name=”paraName(参数名)” value=”paramValue(传递的参数值)”>

JSP内置对象

①request:用来接收客户端提交的各种信息
常用方法:getParameter(String name)获取客户端传递给服务器的各种参数,name指定表单中参数的名字;getParameterNames()获取客户端传递给服务器的所有参数的名字,返回一个枚举类型
Request对象的getAttribute(String name)、setAttribute(String name,Java.long.Object.objt)方法可以用来保存和读取数据

②response: response对象是服务端向客户端返回的数据,使用sendRedirect(String location)方法可以实现页面的转向(与<jsp: forward>的区别是response的参数可以是相对路径也可以是一个合法的URL,并且是一种完全跳转)

③out:动态的向JSP页面输出字符流,进而把动态的内容转化为HTML形式展示

④session:用来保存每个用户的信息,常用方法:getAttribute(String name)获取名字为name的属性、getAttributeNames()返回存储在session对象中的的所有属性的名字,结果为一个枚举类型、setAttribute(String name,Java.lang.Object value)设置一个名字为name的属性,其值为value

⑤application:保存着整个web应用运行期间的全局数据和信息,常用方法:getAttribute(String name)返回application对象中名字为name的属性的值、setAttribute(String name,Object object)在application对象中设置一个名字为name的属性,其值为object

⑥pageContext(JSP作用域通信对象):提供访问其他内置对象的统一方法,方法:getRequest()、getResponse()、getServletConfig()、getServletContext()、getSession()、setAttribute()、removeAttribute()

⑦config:代表当前jsp页面的配置信息(在Servlet中用处较大)

⑧exception:用来封装运行时出现的异常信息

⑨page:指向当前jsp页面本身(类似于this指针),表示当前jsp页面转换后的servlet类的实例


JavaBean

JavaBean是符合一定规范的java类,其封装了一系列的私有属性并提供get和set方法

JavaBean与jsp页面的交互:<jsp:useBean>、<jsp:setProperty>、<jsp:getProperty>
JavaBean

public class Userbean {
    private String username;
    private String pwd;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
}

jsp_form:

    <form action="./AcceptForm.jsp" method="POST">
        用户名:<input type="text" name="username"/>
        密码:<input type="password" name="pwd">
        <input type="submit" value="提交"/> 
    </form>

jsp_accept_form:

<%
    request.setCharacterEncoding("utf-8");
 %>
     <jsp:useBean id="user1" class="com.test.javabean.Userbean"></jsp:useBean>
    <jsp:setProperty property="username" name="user1"/>
    <jsp:setProperty property="pwd" name="user1"/>
    <%--获取JavaBean对象中的值的两种方法 --%>
    <%= user1.getUsername()+':'+user1.getPwd()%>
    <jsp:getProperty property="username" name="user1"/>
    <jsp:getProperty property="pwd" name="user1"/>
</body>

JSP自定义标签

不带属性的自定义标签:

jsp

<%@ page contentType="text/html;charset=utf-8"%>
<%@ taglib prefix="mytag" uri="/mytag" %>
<html>
  <head>
    <title>简单标签实例</title>
  </head>
  
  <body>
    <h3>调用mytag标签库中的print标签</h3>
    调用print标签的结果:<mytag:print/>
  </body>
</html>

标签解析类

public class MytagPrint extends TagSupport{
        @Override
        public int doStartTag() throws JspException {
            try {
                pageContext.getOut().print("Hello Tag!");
            } catch (IOException e) {
                throw new JspTagException("SimpleTag:"+e.getMessage());
            }
            return SKIP_BODY;
        }
        @Override
        public int doEndTag() throws JspException {
        // TODO Auto-generated method stub
        return EVAL_PAGE;
        }
}
不带属性的自定义标签.png

带属性值的自定义标签

jsp

<%@ page contentType="text/html;charset=utf-8"%>
<%--prefix为自定义标签的前缀,uri为tld文件地址--%>
<%@ taglib prefix="mytag" uri="/mytag" %>
<html>
  <head>
   <title>带属性标签实例</title>
  </head>
  
  <body>
    <h3>调用mytag标签库中的printa标签</h3>
    打印后不换行:<mytag:printa value="Hello Tag" type="0" />
    打印后换行:   <mytag:printa value="Hello Tag" type="1" />
    打印后不换行:<mytag:printa value="Hello Tag" type="0" />
  </body>
</html>

标签解析类

public class MytagPrinta extends TagSupport{
    protected String value=null;
    protected String type="0";
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    @Override
    public int doStartTag() throws JspException {
            try {
                if(type.equals("0"))
                pageContext.getOut().print("Hello Tag!"+value);
                else
                pageContext.getOut().print("Hello Tag!"+value+"<br/>");
            } catch (Exception e) {
                throw new JspTagException("attrTag:"+e.getMessage());
            }
            //忽略标签体
            return SKIP_BODY;
    }
    @Override
    public int doEndTag() {
        //继续执行剩下页面的代码
        return EVAL_PAGE;
    }
}

带属性值得自定义标签.png

mytag.tld文件

<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"  
    version="2.0">
<display-name>mytag标签库</display-name>
<tlib-version>2.0</tlib-version>
<short-name>mytag</short-name>
<uri>/mytag</uri>
    <tag>
        <name>print</name>
        <tag-class>tags.MytagPrint</tag-class>
        <body-content>empty</body-content>
    </tag>

    <tag>
        <description>带有type和value属性的printa标签</description>
        <name>printa</name>
        <tag-class>tags.MytagPrinta</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <name>type</name>
            <required>false</required>
        </attribute>
        <attribute>
            <name>value</name>
            <required>true</required>
        </attribute>
    </tag>
</taglib>

JSTL

JSTL是JSP标准标签库,是一个开源的不断完善的标签库
可分为Core tags(核心标签)、Formatting tags(格式化标签)、SQL tags(SQL标签)、XML tags(XML标签)、JSTL function(JSTL函数)5种

核心标签库

<%@ taglib prefix=”c” yri=”http://java.sun.com/jsp/jstl/core”%>

表达式控制标签(out、set、remove、catch)

<c:out value=”object”(要显示的数据内容)[escapeXml=”true|false”](是否转换为特殊字符,如<p></p>等字符是否要显示,默认为true)>
</c:out>
    <c:out value="${3+7}"/> <br>
    <c:out value="<p>有特殊字符</p>" /><br>
    <c:out value="<p>有特殊字符</p>" escapeXml="false" />

    <c:set var="num1" scope="request" value="${3+5}"/>

<c:remove var=”var” [scope=…..]/>

<c:catch [var=”var”]>
  欲捕获的异常部分
</c:catch>

value(Object):需设定的范围变量或对象的属性值
var(String):要设定的范围变量名
scope(String):var指定变量的范围,默认值为page
target(Object):需设定属性的对象
property(String):需设定值的target对象的属性名称

流程控制标签(if、choose、when、otherwise)

    <c:set var="num" scope="page" value="admin"/>
    <c:if test="${num=='admin' }" var="condition" scope="page">
        你好,admin!
    </c:if>
    <c:out value="这是判断结果:${condition}"/>

    <c:set var="num" value="admin" scope="page"/>
    <c:choose>
        <c:when test="${num=='guest'}">
        <c:out value="guest"/>
        </c:when>
        <c:when test="${num=='admin'}">
        <c:out value="admin"/>
        </c:when>
        <c:otherwise>
            <c:out value="other"/>
            </c:otherwise>
    </c:choose>

循环标签(forEach、forTokens)

    <%
        String items[]=new String[5];
        items[0]="核心标签库";  items[1]="国际化标签库";
        items[2]="SQL标签库";   items[3]="XML标签库";
        items[4]="函数标签库";
        request.setAttribute("items", items);
     %>
     <b><c:out value="不指定begin和end的迭代:"/></b>
     <c:forEach var="item" items="${items }">
     &nbsp;<c:out value="${item }"/><br>
     </c:forEach>
     
     <b><c:out value="指定begin和end的迭代:"/></b>
     <c:forEach var="item" items="${items }" begin="1" end="3" step="1">
     &nbsp;<c:out value="${item }"/><br>
     </c:forEach>
     
     <b><c:out value="输出整个迭代的信息:"/></b>
     <c:forEach var="item" items="${items }" begin="3" end="4" step="1"
     varStatus="s">
     &nbsp;<c:out value="${item }"/>的四种属性:<br>
     &nbsp;&nbsp;所在位置,即索引:<c:out value="${s.index }"/><br>
     &nbsp;&nbsp;总共已迭代次数:<c:out value="${s.count }"/><br>
     &nbsp;&nbsp;是否为第一个位置:<c:out value="${s.first }"/><br>
     &nbsp;&nbsp;是否为最后一个位置:<c:out value="${s.last }"/><br>
     </c:forEach>

var(String):表示当前处理对象的变量,可以用来遍历输出
items(支持多种类型,如Array、Collection、Iterator(迭代器)等):表示循环的项目
varStatus(String):记录循环状态的变量
begin(int):循环的起始点
end(int):循环的结束位置,不能小于begin
step(int):循环步长

<c:forTokens>:另一个迭代循环标签,用来对一个字符串进行迭代循环,这些字符串使用符号分开的
    <c:forTokens var="token" items="red,blue,yellow/red,blue/yellow,green" delims="/">
    &nbsp;&nbsp;<c:out value="${token}"/>
    </c:forTokens>
    <h4>
    使用‘|’和‘,’一起作分隔符
    </h4>
    <c:forTokens var="token" items="red,blue,yellow/red,blue/yellow,green" delims="/,">
    &nbsp;&nbsp;<c:out value="${token}"/>
    </c:forTokens>

items(String):要处理的一系列以特定符号隔开的字符串
delims(String):分隔字符集合
var(String):输出时可用

URL标签(import、url、redirect)

<c:import>:引入某个URL指定的网页内容到当前jsp
<c:rediect>和<c:param>:用来进行参数值的传递

  <c:redirect url="c_redirect2.jsp">
  <c:param name="username" value="admin" />
  </c:redirect>

格式化标签库

<%@ taglib prefix=”fmt” yri=”http://java.sun.com/jsp/jstl/fmt”%>
不同地区对数字、货币等的表示不同,通过该标签库来根据不同的语言请求做出不同的响应
<fmt:setLocale>:设定用户的语言地区代码

<fmt:setLocale value=”value”(语言环境的字符串http://www.w3.org查询) [variant=””(指定web浏览器或供应商代号) [scope=....]>en表示英文、en_US表示英文(美国)、zh_CN表示中文(中国)

<fmt:message>:根据本地化环境从资源包检索文本信息,从而实现文本的本地化

<fmt:bundle>:用来根据本地环境来选择所需的资源包

<fmt:setbundle>:为本地化环境设置一个默认的资源包

<fmt:param>:指定文本消息参数值,动态的设置参数

<fmt:timeZone>:设置时区

<fmt:formatDate>:设定日期和时间的格式并按照设置的格式给予输出

<fmt:parseDate>:解析日期和时间值

<fmt:formatNumber>:格式化数值,即设定特定语言环境下的数值的输出方式

<fmt:parseNumber>:解析数值字符串

<%@ page  language="java" import="java.util.*" contentType="text/html;charset=gb2312"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
  <head>
    <title>数字格式化标签实例</title>
  </head>
  
  <body>
    <font size=4>
        <fmt:setLocale value="en_US"/>
        美国:<br>
        数字格式:<fmt:formatNumber value="123456789"/><br>
        百分数格式:<fmt:formatNumber type="percent">123456789</fmt:formatNumber><br>
        货币格式:<fmt:formatNumber value="12345.67" type="currency"/><br>
        <c:set var="date" value="<%=new java.util.Date() %>"/>
            <fmt:formatDate value="${date }"
                pattern="yyyy年MM月dd日" type="date" dateStyle="full"/><br>
            <fmt:formatDate value="${date }"
                pattern="HH:mm:ss" type="time" timeStyle="full"/><br>
            <fmt:formatDate value="${date }"
                pattern="yyyy年MM月dd日HH:mm:ss"
                type="both" dateStyle="full" timeStyle="full"/><br>
            <fmt:formatDate value="${date }" type="both"
                timeStyle="full" var="formatted"/>
            <fmt:parseDate value="${formatted }" type="both"
                timeStyle="full" timeZone="GMT" var="parsed"/>
            <c:out value="${parsed }"/><br>             
    </font>
  </body>
</html>
fmt标签库结果.png

SQL标签

<%taglib prefix=”sql” uri=”http://java.xun.com/jsp/jstl/sql”%>
使用JDBC方式连接数据库:

<sql:setDateSource
driver=””(数据库驱动程序字符串) url=””(数据库连接字符串) [user=””(数据库登录用户名)] [password=””] [var=””] [scope=””]/>

XML标签

<%@ taglib prefix=”x” yri=”http://java.sun.com/jsp/jstl/xml”%>
<x:parse>解析一个XML文档

        <c:import var="doc" url="Students.xml" charEncoding="gb2312"/>
        <x:parse var="studentDoc" doc="${doc }"/>
        <c:out value="学生姓名:"/>
        <x:out select="$studentDoc/students/student/name"/><br>
        <c:out value="学生年龄:"/>
        <x:out select="$studentDoc/students/student/age"/><br>
        <c:out value="学生性别:"/>
        <x:out select="$studentDoc/students/student/sex"/><br>

JSTL函数标签

<%taglib prefix=”fn”uri=”http://java.xun.com/jsp/jstl/functions”%>

fn:contains(string,substring):如果参数string包含参数substring,返回true
fn:containsIgnoreCase(string,substring):……(忽略大小写)

fn:endsWith(string,suffix):字符串string以suffix结尾,返回true

fn:join(array,separator):将一个给定的数组array用给定的间隔符separator串在一起

fn:replace(string,before,after):返回一个string对象,用参数after替换参数string中所有出现参数before字符串的地方

  <c:set var="s1" value="I love java web!"/>
  <%
    String[] customers={"Lester","Johnson","Jake"};
    session.setAttribute("customers", customers);
   %>
   <table cellpadding="5" border="1">
   <tr>
   <th align="Left">Input String</th><th>Result</th>
   </tr>
   <tr>
    <td>${s1}</td><td>${fn:length(s1)}</td>
   </tr>
   <tr>
    <td>${customers}</td><td>${fn:length(customers)}</td>
   </tr>
   <tr>
    <td>null</td><td>${fn:length(undefined)}</td>
   </tr>
   <tr>
    <td>empty string</td><td>${fn:length("")}</td>
   </tr>
   </table>

EL表达式

实现对session对象、request对象等存储对象的简化访问
语法:${表达式}
设置EL支持

设置单个JSP页面是否支持EL(默认为支持,值为false):
<%@ page isELIgnored=”true|false”%>
对于整个JSP应用,修改web.xml配置文件来支持EL,格式为(false为支持)
<jsp-property-group>
  <el-ignored>false|true</el-ignored>
</jsp-property-group>

EL应用

①运算符求值(+、-、*、/、gt(大于)、lt(小于)、le(小于等于)、ge(大于等于)、ne(不等于)、and、or等等)
②访问作用域对象,格式为${attrname(作用域变量名)}
③EL内置对象


EL内置对象.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • JSP 基本结构JSP 页面组成:模板文本(HTML,XML,纯文本),JSP 元素;JSP 元素:脚本元素,指令...
    jslancer阅读 829评论 0 11
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 1什么是JSTLJSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言!JSTL...
    TY_阅读 370评论 0 1
  • JSP 标准标签库(JSTL) JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能...
    FTOLsXD阅读 323评论 1 2
  • 1、引言 数据库设计过程中表、字段等的命名规范也算是设计规范的一部分,不过设计规范更多的是为了确保数据库设计的合理...
    SnowflakeCloud阅读 40,937评论 0 48