JAVA EE-JSP

JAVA EE-JSP

当一个人在深思的时候,他并不是在闲着。有看得见的劳动,也有看不见的劳动。 —— 雨果

什么是JSP?
java server page  运行在服务器端的页面.  ==> 本质就是servlet.
运行流程:
    jsp =(第一次访问时)=> .java ==> .class ==> 运行
JSP中的脚本:
    <% java内容 %>  该脚本包裹的代码会出现在 service方法中
    <%=表达式 %>  该脚本用于输出内容.out.print();方法包裹输出内容.
    <%! 内容 %>(了解): 该脚本包裹的内容会出现在类定义中.
关于EL表达式
   代替 脚本 => 输出脚本 <%= %>
   格式: ${表达式}
   EL表达式可以在4个域中取数据 => 4个内置对象 applicationScope/requestScope/sessionScope/pageScope
  从指定域取值: ${requestScope.name}<br>
            ${applicationScope.name}<br>
 不指定域取值: ${name}<br>  => 从小域到大域中查找.显示最先找到的. 
JSP的翻译过程

这里写图片描述

JSP的脚本元素

这里写图片描述

JSP的页面注释
  • JSP注释:<%– … –%>,转化阶段消失,只能被开发人员看到
  • JAVA注释://、//、/*/,编译阶段消失
  • HTML注释: , 不会消失,在页面中也能看到
JSP的指令元素
  • 功能
    • 用于指示JSP执行某些步骤
    • 用于指示JSP表现特定行为
  • 语法格式
    <%@ directive [ attribute =“value” ] * %>
  • 分类

    • page指令标记
    • include指令标记
    • taglib指令标记
  • page属性包含在“<%@ page ”和“%>”之间。

  • 这些属性可以单独使用,也可以几个或多个同时使用
  • page指令用来定义JSP文件的全局属性
  • 在JSP页面中,只有import可以出现多次,其它属性都只能出现一次
    这里写图片描述
    这里写图片描述
    page   指令
    include指令
    taglib 指令

    功能:
        page   : 描述页面的一些属性.
        include: 静态包含指令
        taglib : 导入标签指令

page :  <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    page指令用于指定页面一些基本属性.
    language="java" 页面中使用的语言为java.
    *import="java.util.*"  就是导包. 是所有属性中唯一一个可以在页面中出现多次的属性.
    *pageEncoding="UTF-8"   页面保存到硬盘编码.
    *contentType="text/html; charset=UTF-8" 发送给浏览器的编码 . 
        以上两个码表最好一致. 但是一般设置一个属性即可.另外一个属性自动设置.
    autoFlush="true" 如果缓冲区装满是否自动刷新到浏览器. 如果装满并没有选择自动刷新,那么会抛出异常.
    buffer="8kb"    决定jsp输出缓冲区大小为8kb
    errorPage=""    配置当前页面的错误页面
    isErrorPage="false" 指定当前页面是否是一个错误页面
            开发中,我们可以使用如下配置统一配置错误页面 比上面的方式要省事:
                      <error-page>
                        <error-code>500</error-code>
                        <location>/page/B.jsp</location>
                      </error-page>

    extends="" 决定当前jsp的父类是谁.父类必须是servlet的子类.
     info="" getServletInfo 刚方法的返回值.
     isELIgnored="false"  决定当前页面能否使用 EL表达式. 默认值就是支持el.
     session="true" 当前jsp页面是否可以直接使用session对象.默认值就是true.
JSP中的静态包含
  • include指令的语法格式如下
<%@ include file=“filename” %>
  • include指令的作用是在JSP页面中静态包含一个文件,同时由JSP解析包含的文件内容
  • 静态包含的含义
  • file不能为一变量
<% String url="index.html" ; %>
<%@ include file = "<%= url %>" %>
  • 不可以在file 所指定的文件后接任何参数
<%@ include file = "jw.jsp?nm=browser" %>

比如
包含的是目标文件的源码;包含过来,一起翻译

main.jsp
<%
          String s = “abc”;
%>
<%include file=“part.jsp” %>
part.jsp
<%=s %> 没有定义变量s
尽管part.jsp本身会有错误
但是运行main.jsp就可以正确引入part.jsp
JSP的内置对象
  • 指的在jsp中不加以声明就可以直接使用的9个对象.

  • 原理: 因为我们的代码是写在jsp对应java的service方法中的.所以在service方法中声明的变量,我们可以直接使用.
    这里写图片描述

JSP中内置对象的类型
  • request HttpServletRequest
  • response HttpServletResponse
  • session HttpSession
  • application ServletContext
  • config ServletConfig
  • page this (HttpServlet)
  • pageContext PageContext
  • exception Throwable (所有异常父类)
  • out JspWriter
public void _jspService(HttpServletRequest 1>request, HttpServletResponse 2>response)
        throws java.io.IOException, ServletException {

    PageContext 3>pageContext = null;
    HttpSession 4>session = null;
    Throwable 5>exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
    if (exception != null) {
      response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
    }
    ServletContext 6>application = null;
    ServletConfig 7>config = null;
    JspWriter 8>out = null;
    Object 9>page = this;
JSP中的四种数据范围
  • page Page_Scope 页面的不同部分间共享数据
  • request
  • session
  • application
  • setAttribute getAttribute
  • removeAttribute
关于pageContext对象
  • pageContext对象可以直译为“页面上下文”对象,代表的是当前页面运行的一些属性
  • 它是javax.servlet.jsp.PageContext类的实例对象,可以使用PageContext类的方法。pageContext对象提供了对JSP页面所有的对象及命名空间的访问
*本身是一个域对象. 在pageContext对象上有一个map. 这个Map就是Page域.
        操作: 4个操作.
        范围: 就只在当前页面中有用.
        作用: 在jsp中应避免在页面上书写任何java代码.
                //pageContext.setAttribute(name, value);
                //  pageContext.getAttribute(name);
                //pageContext.removeAttribute(name);
                //pageContext.getAttributeNamesInScope(scope);
    *pageContext对象还可以操作其他3个域
        目的就是为了方便.
            pageContext.setAttribute("name", "applicationTom",PageContext.APPLICATION_SCOPE );
            pageContext.setAttribute("name", "sessionTom",PageContext.SESSION_SCOPE );
            pageContext.setAttribute("name", "requestTom",PageContext.REQUEST_SCOPE );

        //pageContext.getAttribute(name, scope);
        //pageContext.removeAttribute(name, scope);
        //pageContext.getAttributeNamesInScope(scope);
        //pageContext.findAttribute("name") 会从所有域中查找键. 从小到大
    *持有其他8个内置对象的引用.根据这个对象可以获得其他8个内置对象
        pageContext.getRequest();
        pageContext.getResponse();
        pageContext.getSession();
        pageContext.getServletContext();
        pageContext.getException();
        pageContext.getServletConfig();
        pageContext.getOut();
        pageContext.getPage();
out对象

这里写图片描述

  • 向客户端输出数据
  • 管理服务器输出缓冲区
  • 内部使用PrintWriter对象来输出文本级数据
  • 通过page指令的buffer属性来调整缓冲区的大小,默认的缓冲区是8kb
out 对象是jsp当中的输出对象.
        代码:
            out.print("a");
            response.getWriter().print("b");
            out.print("c");
            response.getWriter().print("d");
        输出: bd ac 
    原理:
        在输出到浏览器时,会先把两个流合并,再输出.
        合并时response的字符流在前.
        JSPWriter在后. 所以不管代码书写顺序如何.最终
        response流的内容总会在JSPwriter流的内容之前
    结论: 在jsp中输出使用out(JSPWriter)输出,不要使用response.getWriter输出.
JSP标签
  • JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。

  • 语法

<jsp:include page={"relativeURL" | "<%= expression %>"} />

<jsp:include page={"relativeURL" | "<%= expression %>"} >
    <jsp:param name="PN" 
            value="{PV | <%= expression %>}" /> *
</jsp:include> 
  • JSP的常用动作标签
<jsp:useBean> 
使用一个ID和一个给定作用范围和同一ID的JavaBean相关联
<jsp:setProperty> 
设置JavaBean的属性值
<jsp:getProperty> 
取得JavaBean的属性值
<jsp:include>  
请求时文件包含
<jsp:forward> 
接受用户输入并将请求分派给另一页面
<jsp:param>

forward标签详解

  </head>

  <body>
   <%-- JSP动作标签
            分担jsp页面的java代码
    --%>

    <jsp:forward page="/index.jsp"></jsp:forward>
    <%-- //下面的代码相当于上面的标签
        request.getRequestDispatcher("/index.jsp").forward(request, response);
     --%>
  </body>
</html>

include标签详解

  <body>
   <%-- JSP动作标签
            分担jsp页面的java代码
    --%>

    <jsp:include page="/index.jsp"></jsp:include>
    <%--
        // jsp 动态包含
        request.getRequestDispatcher("/index.jsp").include(request, response);
    --%>
  </body>

<jsp:include>与include指令的比较

  • <jsp:include>标签是动态引入, <jsp:include>标签涉及到的2个JSP页面会被翻译成2个servlet,这2个servlet的内容在执行时进行合并。
  • 而include指令是静态引入,涉及到的2个JSP页面会被翻译成一个servlet,其内容是在源文件级别进行合并。
  • 不管是<jsp:include>标签,还是include指令,它们都会把两个JSP页面内容合并输出,所以这两个页面不要出现重复的HTML全局架构标签,否则输出给客户端的内容将会是一个格式混乱的HTML文档。

这里写图片描述

JavaBean
  • 功能: 将表单参数封装到User对象
    //参数1: 填写User对象
    //参数2: 填写需要封装到User对象的参数Map
    BeanUtils.populate(u,request.getParameterMap());
    注意: 表单的参数的键必须与Bean中属性名称对应
    // BeanUtils 可以自动帮你转换8个基本数据类型. 如果遇到自定义类型需要转换.我们要自己写一个转换器并注册
    1.自定义转换器
            public class MyDateConverter implements Converter {
                //参数2 : 待转换的类型传递进来. => 2012-12-12
                // 转换好之后,使用返回值返回  =>  Date对象
                //参数1:  告诉你要转换成什么类型的
                public Object convert(Class arg0, Object arg1) {
                    //创建格式化器
                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                    //使用格式化器将参数格式化成日期类型
                    try {
                        Date date = format.parse(arg1.toString());
                        //没出异常.就返回日期对象.
                        return date;

                    } catch (ParseException e) {
                        e.printStackTrace();
                        //出现异常返回null
                        return null;
                    }
                }
            }
    2. 转换器注册
                //注册我们自定义的转换器
                //参数1 自定的转换器
                //参数2 注册转换的类型
                ConvertUtils.register(new MyDateConverter(), Date.class);
完成如上两步即可.

首先创建一个学生类

//javaBean
//1.要求为属性提供get/set方法任意之一
//2.需要有空参构造
//3.实现串行化接口(可选)
public class User {
    private String name;
    private String password;
    private int age;
    private Date hiredate;



    public Date getHiredate() {
        return hiredate;
    }
    public void setHiredate(Date hiredate) {
        this.hiredate = hiredate;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", password=" + password + ", age=" + age
                + ", hiredate=" + hiredate + "]";
    }



}

一个小Demo

public class AServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        // 创建User对象
        User u = new User();
        // 将表单参数封装到User对象
        //参数1: 填写User对象
        //参数2: 填写需要封装到User对象的参数Map
        try {
            //如果我们需要BeanUtils支持非8大基本数据类型.我们只要给BeanUtils添加类型转换器即可
            //注意:注册类型转换器,必须写在populate方法之前.
            ConvertUtils.register(new MyDateConverter(), Date.class);


            //BeanUtils在封装时可以完成类型转换. 自动转换的范围 只限于 8个基本数据类型
            BeanUtils.populate(u,request.getParameterMap());
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

        System.out.println(u);

    /*  //1 获得参数
        String name = request.getParameter("name");
        String password = request.getParameter("password");
        //2 封装参数  User
        User u = new User();
        u.setName(name);
        u.setPassword(password);*/
        //-------------------------------------------------------
        //3 将User对象交给业务类处理
        //4 根据处理结果
            //成功=>在session加入成功标识,并重定向到成功页面
            //失败=>回到登录页面.提示错误信息



    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}
JSTL标签
    用于代替,简化页面中的java代码.
    Java standard Tag Library   => java标准标签库
    apache组织提供一套已经开发好的标签库.
    这套标签库在javaee 5.0版本后已经纳入标准.(使用不需要导包)
    该套标签库一共分为4个库:
    core:核心库(用的最多的)****
    fmt:格式化库(2个)
    xml:xml的操作相关(废弃)
    sql: 与数据库操作相关(废弃)
  • core库(重点:if choose foreach url):
    • 在页面引入标签库
    • 2.使用.
      if标签
<%-- <c:if>(常用) 判断
                test="${num1 > num2 }"  填写返回值为boolean的表达式
                var="if"                键
                scope="page"            域  将判断结果以var属性值为键放入该属性指定的域中.

             --%>
            <%
                request.setAttribute("num1", 1000);
                request.setAttribute("num2", 10000);
             %>
             <c:if test="${num1 > num2 }" var="if" scope="page" >
                num1 厉害!
             </c:if>
             ${pageScope.if}
                <hr>

if else

<%--  判断标签.支持if else形式
                    <c:choose>
                    <c:when>
                        test: 填写返回值为boolean的表达式
                    <c:otherwise>
             --%>
             <c:choose>
                <c:when test="${num1 > num2 }">
                    num1 厉害!
                </c:when>
                <c:otherwise>
                    num2 厉害!
                </c:otherwise>
             </c:choose>
                 <hr>

遍历标签

            <%--  <c:forEach>(常用) 遍历标签 
                items="${requestScope.list}" 要便利的集合设置给该属性
                 var="abc"      每次遍历集合中元素 该属性值作为键放入page域
                  varStatus="st"    每次遍历的状态,会封装成一个对象 以该属性值为键 放入page域
            数数的功能
                     begin="1"  从几开始数  
                     end="100"  数到几
                     step="1"   每次数几个数
                     var="num"  将当前数的数以该属性值作为键放入page域
             --%>
             <%
                List list  = new ArrayList();
                list.add("tom");
                list.add("jerry");
                list.add("jack");
                list.add("rose");

                request.setAttribute("list", list);
              %>

              <table border="1">
                <tr>
                    <th>名称</th>
                    <th>是否是集合中第一个元素</th>
                    <th>是否是集合中最后一个元素</th>
                    <th>显示当前遍历的索引</th>
                    <th>显示当前遍历的计数</th>
                </tr>
                <c:forEach items="${requestScope.list}" var="abc" varStatus="st" >
                    <tr id="${st.index%2==0?"even":"odd"}" >
                        <td>${pageScope.abc}</td>
                        <td>${pageScope.st.first}</td>
                        <td>${pageScope.st.last}</td>
                        <td>${pageScope.st.index}</td>
                        <td>${pageScope.st.count}</td>
                    </tr>       
                </c:forEach>
              </table>
             <hr>
             <!-- ----------------------------------------------------------------------- -->
            <c:forEach begin="1" end="100" step="1" var="num" >
                ${num}
            </c:forEach>  
fmt库  格式化库
    格式化日期
        <!--  
            格式化日期
            fmt:formatDate
         -->
        <fmt:formatDate value="<%=new Date() %>"  
            pattern="yyyy/MM/dd hh:mm:ss" var="date" scope="request" />

        ${requestScope.date}
    格式化数字
        <!--  
            格式化数字
            fmt:formatNumber
         -->
        <fmt:formatNumber  value="3.1415926" pattern="0000.00000000000" var="num1" scope="request" ></fmt:formatNumber>
        <fmt:formatNumber  value="3.1415926" pattern="####.###########" var="num2" scope="request" ></fmt:formatNumber>
        ${requestScope.num1}<br>
        ${requestScope.num2}<br>
JSP中的路径总结问题

路径总结
前提: 所有路径都应以”/”开头.

项目名:day10-jsp
资源名:AServlet

客户端路径 => 给浏览器用的路径 => 填写项目名称
    <form action="/day10-jsp/AServlet" >
    <img src="/day10-jsp/AServlet" >
    <a href="/day10-jsp/AServlet" >
    response.sendRedirect("/day10-jsp/AServlet")
服务器端路径 => 给服务器端使用的路径 => 填写项目下的路径
     request.getRequestDispatcher("/AServlet")
     errorPage="/AServlet"
     <location>/AServlet</location>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值