JSP简述,指令,内置对象,EL,JSTL

JSP

JSP是一种Web服务设计标准,以Java技术为基础,实现页面的动态输出。
Serlvet 提供了用于服务器编程的API,但是不能有效地管理页面的逻辑部分和页面输出部分,导致Servlet类的代码非常混乱,为了克服这个缺点,Sun公司用Servlet为基础,推出了JSP。

JSP页面组成
1.普通的HTML标记符。
2.JSP标记,如指令标记,动作标记。
3.变量和方法的声明。
4.Java程序片。
5.Java表达式。

<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>

<%--JSP 指令标记--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%!
    String mCurTime;
    public String showTime() {
        return new SimpleDateFormat("yyyy年MM月dd日").format(new Date());
    }
%>

<html>
<head>
    <title>JSPDemo</title>
</head>
<body>
    <%
        //Java程序片
        mCurTime = showTime();
    %>
    当前时间:<%= mCurTime%> //Java表达式
</body>
</html>
效果

JSP语法

1.声明变量,方法
在<%! %> 标记符号之间放置Java的变量声明和方法。
声明的变量为JSP页面的 全局变量,在整个JSP页面都有效。
方法在程序片中调用<% %>

习惯将<%! %> 放在JSP页面的前面。
注意:全局变量为所有线程共享,操作数据要注意加锁等待。

<%!
    int mCount = 0;
    public synchronized int getCount() {
        return mCount++;
    }
%>
2.Java程序片,表达式
1.Java程序片
在<% %>之间插入Java程序片,JSP页面的程序片会被JSP引擎按顺序执行。

2.Java表达式
在<%= %>间插入表达式,%=间不能有空格
这个表达式 必须能求值,表达式的值由服务器负责计算,并将结果以 字符串的形式发送到客户端显示。

在程序片中声明的变量都是 局部变量。
<body>
    <% int curCount;
        curCount = getCount(); %>
    第<%=curCount %>个访问本网站
</body>

JSP指令标记

1.page 指令标记

page指令用来定义整个JSP页面的一些属性,page指令对整个页面都有效,与书写位置无关,但是一般习惯放在JSP页面最前端。

<%@ page contentType="text/html;charset=UTF-8" language="java"
         import="java.util.Date"
         session="true"
         buffer="8kb"
         autoFlush="true"
         isThreadSafe="true"
%>

contentType:定义JSP页面响应的MIME类型和字符编码。
language:定义JSP页面使用的脚本语言。
session:用于设置是否需要使用内置的session对象,默认true

buffer:内置out对象缓冲区的大小,或不用缓冲区none
autoFlush:缓冲区填满时,是否自动刷新,默认true

isThreadSafe:是否可以多线程访问,默认true
2.include 指令标记

可以在JSP页面出现该指令的位置处,静态插入一个文件。
使用include可以使代码复用,比如每个页面都需要导航条时。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>nav</title>
</head>
<body>
    假装这是个导航栏,和两千行相同的代码
</body>
</html>


<%@include file="nav.jsp"%>
<html>
<head>
    <title>JSPDemo</title>
</head>
<body>
    <br/>
    假装这是不同的主题内容
</body>
</html>
效果

JSP动作标记

动作标记是一种特殊的标记,它影响JSP 运行时 的功能。

public class  User {

    private String name;
    private int age;

    public User() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
  <body>

    <%--生成User对象,id=bean的对象名,class=bean所在的包 scope=作用范围--%>
    <jsp:useBean id="user" class="com.bean.User" scope="session"/>
    <%--设置值--%>
    <jsp:setProperty name="user" property="name" value="张三" param="name"/>
    <%--获取值--%>
    <jsp:setProperty name="user" property="age" value="18"/>
    <jsp:getProperty name="user" property="name"/>
    <%="年龄:"+user.getAge()%>

  </body>

JSP内置对象

有些对象不用声明就可以在JSP页面的Java程序片和表达式中部分使用,这些就是JSP内置对象。

常用的内置对象
request
response

session
application
out
1.request 对象
request封装了用户提交的信息,使用request对象可以获取表单提交的信息。

常常使用HTML中的表单向服务器的某个JSP页面提交信息
 <body>
    <form action="#" method="get">
        <input type="text" placeholder="用户名" name="name">
        <input type="submit" value="提交">
    </form>

    <%String userName;
        userName = request.getParameter("name");
        if (userName!=null)
            out.println("提交的用户名为:"+userName);
    %>
  </body>

Request 对象常用API

<%
        request.getParameterMap();
        request.getMethod();
        request.getServerName();//获取服务器名称
        request.getServerPort();//获取服务器的端口
        request.getRemoteAddr();//获取用户IP地址
        request.getServletPath();//获取获取用户请求的Web服务目录
    %>
2.response对象

response对象,用于对用户的请求作出动态响应,向客户端发送数据。

response状态行
1xx:(1开头的3位数)主要是实验性质。

2xx:表明请求成功
3xx:在请求满足前应采取进一步行动

4xx:浏览器无法满足请求
5xx:服务器出问题
当将网页保存在word 文档时需要修改MIME类型,这时用响应修改

 <body>
    <P>是否确认将当前页面保存为Word文档</p>
    <form action="#" method="get">
        <input type="submit" name="submit" value="提交">
    </form>

    <%
       if ("提交".equals(request.getParameter("submit")))
           response.setContentType("application/msword;charset=gb2312");
    %>
  </body>
response重定向

 <body>
    <P>是否确认跳转</p>
    <form action="#" method="get">
        <input type="submit" name="submit" value="提交">
    </form>

    <%
       if ("提交".equals(request.getParameter("submit")))
           response.sendRedirect("nav.jsp");
    %>
  </body>
3.session对象

当用户第一次访问Web服务目录上的一个JSP页面时,JSP引擎会创建一个和该用户对应的Session对象,当用户在所访问的Web服务目录的各个页面之间浏览时,这个Session对象都是同一个。

session 重写URL

用户从一个页面重新连接到另一个页面时,通过新的URL添加参数,把session对象的id传过去,从而保证了各页面中session对象是同一个。

<%
   response.encodeRedirectURL("demo.jsp");
%>
session 存储数据
  <body>
    <P>是否确认跳转</p>
    <form action="#" method="get">
        <input type="text" placeholder="用户名" name="name">
        <input type="submit" name="submit" value="提交">
    </form>

    <%
        String name = request.getParameter("name");
        session.setAttribute("username",name);
        session.getAttribute("username");
        session.removeAttribute("username");
        session.invalidate();
    %>
  </body>
4.application对象

application对象由服务器负责创建,每个Web服务目录下的application对象被访问该服务目录所有的用户共享。

    <%
        application.setAttribute("username",name);
        application.getAttribute("username");
        application.removeAttribute("username");
    %>
4.out对象

用来向客户端输出数据

    <%
        out.print("");
        out.println("");
        out.newLine();
        out.flush();
        out.clear();
    %>

EL(Expression Language)

EL为 JSP 提供了简化表达式的方法,让JSP的代码更加简化。

基本语法:${express}
从作用域中获取共享数据

EL表达式在获取某个对象的属性值时,先将某个属性值的首字母变成大写,然后加上 get 前缀,拼接成get方法,再通过反射将该对象构建出来,然后再对该对象执行getter方法,这与私有属性并没有关系,所以要注意,JavaBean的属性名要小写,且要有getter方法,不然会报错。

使用EL表达式,获取数据时,会在四大作用域中顺序查找,直到找到为止。
若找不到键值对应的属性值,不会显示Null,会显示空字符串。

作用域的查找顺序
page
request
session
application
1.直接从JavaBean中获取数据

@WebServlet(value = "/a")
public class AServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        UserBean userBean = new UserBean();
        userBean.setName(req.getParameter("name"));
        req.getSession().setAttribute("user",userBean);
        resp.sendRedirect("show_user_info.jsp");
    }
}

<%-- 获得所创建Bean的引用 --%>
<%--<jsp:useBean id="user" type="com.bean.UserBean" scope="session"/>--%>
<html>
<head>
    <title>JSPDemo</title>
</head>
<body>
    <p>
        提交的用户名为:<%--<jsp:getProperty name="user" property="name" />--%>
        ${user.name}
    </p>
</body>
</html>
2.从List集合中获取数据

@WebServlet(value = "/a")
public class AServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        List<UserBean> userBeanList = new ArrayList<>();
        UserBean userBean = new UserBean();
        userBean.setName(req.getParameter("name"));
        userBeanList.add(userBean);

        req.getSession().setAttribute("userList",userBeanList);
        resp.sendRedirect("show_user_info.jsp");
    }
}


<body>
    <p>
        提交的用户名为:
        ${userList[0].name}
    </p>
</body>
3.从Map集合中获取数据

@WebServlet(value = "/a")
public class AServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        Map<String,UserBean> userBeanMap = new HashMap<>();
        UserBean userBean = new UserBean();
        userBean.setName(req.getParameter("name"));
        userBeanMap.put("user1",userBean);

        req.getSession().setAttribute("userMap",userBeanMap);
        resp.sendRedirect("show_user_info.jsp");
    }
}

<body>
    <p>
        提交的用户名为:
        ${userMap['user1'].name}
    </p>
</body>

JSTL(JavaServer Pages Standard Tag Library)

JSTL主要提供给Java Web开发人员一个标准通用的标签函数库,解决JSP中写Java代码麻烦的问题。

使用步骤
1.导入JSTL的Jar

2.在jsp文件顶部加入taglib指令引入jar
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

3.导入c.tld文件解决报错问题
添加http://java.sun.com/jsp/jstl/core
File:填写解压后tld文件夹下的 /jakarta-taglibs-standard-1.1.2/tld/c.tld

4.在Web.XML中将Jar导入

下载JSTL的Jar

JSTL的使用
c:if (单条件判断)
test:条件表达式
var:返回结果,true,false
scope:指定从哪个作用域获取数据


  <body>
     <%
        int limit = 18;
        request.setAttribute("age",limit);
     %>

     <c:if test="${age>18}">
         可浏览
     </c:if>

     <c:if test="${age>=18}" var="res" scope="request">
         ${requestScope.res}
     </c:if>

  </body>
结果
c:choose,c:when,c:otherwise(多条件判断标签使用)
 <body>  
    <%
        Integer score = 90;
        request.setAttribute("score", score);
    %>

    <c:choose>
        <c:when test="${score >= 90}">优秀</c:when>
        <c:when test="${score >= 60 && score<90}">及格</c:when>
        <c:otherwise>不及格</c:otherwise>
    </c:choose>

  </body>
c:forEach(循环标签)

items:要遍历的集合,一定要写EL表达式
var:返回的集合item值
varStatus:一个辅助类,标记行数

<body>
    <%
        List list = new ArrayList();
        list.add("Data1");
        list.add("Data2");
        list.add("Data3");
        request.setAttribute("lists", list);
    %>

    <c:forEach items="${lists}" var="item" varStatus="vs">
        ${vs.count}:
        ${item}<br />
    </c:forEach>

    <!-- 输出数字1-10 -->
    <c:forEach begin="1" end="10" step="1" var="num">
        ${num}
    </c:forEach>

  </body>

XML(可扩展置标语言)

1.XML声明
<?xml version="1.0" encoding="UTF-8" ?>
声明位于XML文件的第一行,以<?xml标记开始,以?>标记结束。

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

推荐阅读更多精彩内容