美文网首页
JSP简述,指令,内置对象,EL,JSTL

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

作者: 云承寒 | 来源:发表于2017-06-30 17:46 被阅读0次

    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编码,字母包括汉字。
    标记名称区分大小写
    

    相关文章

      网友评论

          本文标题:JSP简述,指令,内置对象,EL,JSTL

          本文链接:https://www.haomeiwen.com/subject/zxjicxtx.html