美文网首页
黑猴子的家:JavaWeb 之 JSP

黑猴子的家:JavaWeb 之 JSP

作者: 黑猴子的家 | 来源:发表于2019-12-13 10:24 被阅读0次

    1、JSP 概述

    1)Why? 为什么要有jsp

    Servlet可以通过转发或重定向跳转到某个HTML文档。但HTML文档中的内容不受Servlet的控制。比如登录失败时,跳转回登录表单页面无法显示诸如“用户名或密码不正确”的错误消息,所以我们目前采用的办法是跳转到一个错误信息页面。如果通过Servlet逐行输出响应信息则会非常繁琐。

    Servlet HTML
    长处 接收请求参数,访问域对象,转发页面 以友好方式显示数据
    短处 以友好方式显示数据 动态显示数据

    那能否将Servlet和HTML二者的长处结合起来呢?

    2)What? 什么是jsp

    Java Server Page
    JSP = HTML + Servlet
    (1)JSP的本质是一个Servlet,Servlet能做的事情JSP都能做。
    (2)JSP能够以HTML页面的方式呈现数据,是一个可以嵌入Java代码的HTML。
    (3)JSP不同于HTML,不能使用浏览器直接打开,而必须运行在Servlet容器中。

    2、JSP的本质

    1)jsp声明在

    Java 虚拟机要想运行一个类,需要先把java源代码变异成java字节码,变成.class才能运行,一个jsp是根本无法直接运行的,那么怎么办呢? Tomcat提供了jsp的解析器,把jsp解析成java代码,再把jsp编译成class文件,解析出来的代码放到哪里去了呢?放到work目录下


    2)或者声明在

    3、code

    1)LoginServlet
    package com.alex.web.servlet;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class LoginServlet extends HttpServlet {
    
        private static final long serialVersionUID = 1L;
    
        // 处理请求使用的
        @Override
        public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            request.setCharacterEncoding("UTF-8");
            response.setContentType("text/html;charset=UTF-8");
    
            String username = request.getParameter("username");
            String passwd = request.getParameter("passwd");
    
            if ("admin".equals(username) && "123".equals(passwd)) {
                request.setAttribute("name", "admin");
                request.setAttribute("age", 20);
                request.getSession().setAttribute("name", "Tom");
                request.getSession().getServletContext().setAttribute("name", "alex");
                request.getRequestDispatcher("/success.jsp").forward(request, response);
            } else { 
                response.sendRedirect(request.getContextPath() + "/failure.jsp");
            }
        }
    }
    
    2)failure.jsp
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8" isErrorPage="true"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    failure
    <% exception.equals("e"); %>
    </body>
    </html>
    
    3)login.jsp
    <!--  HTML注释   -->
    <%-- JSP 注释 --%>
    <%--  page指令:用于设置当前页面 --%>
    <%--  taglib指令:用于加载标签库 --%>
    <%--  include指令:用于包含其它页面 --%>
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        Get
        <form action="LoginServlet" method="get">
            用户名:<input type="text" name="username" />
            <br/>
            密码:<input type="text" name="passwd" /> 
            <br/>
            <!-- 访问AutoByEclipseServlet中的doGet方法 -->
            <input type="submit" value="发送GET请求" />
        </form>
        <br />
        <br />
        POST
        <form action="LoginServlet" method="post">
            用户名<input type="text" name="username" />
            <br/>
            密码:<input type="text" name="passwd" />
            <br/>
            <!-- 访问AutoByEclipseServlet中的doPost方法 -->
            <input type="submit" value="发送POST请求" />
        </form>
    </body>
    </html>
    
    4)success.jsp
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    <link rel="stylesheet" href="css/success.css">
    <script src="${pageContext.request.contextPath}/js/jquery.min.js"></script>
    <script type="text/javascript">
    </script>
    <style type="text/css">
         body {
                padding: 0px;
                margin: 0px;
            }
    </style>
    </head>
    <body>
    success
    <% 
    //不推荐在jsp中写Java代码,不易于维护
    //页面数据处理,推荐使用JSTL 和 EL 表达式
    String name = (String)request.getAttribute("name");
    out.println("欢迎," + name);
    %>
    <br /><br />
    <c:out value="${requestScope.name}"></c:out><br /><br />
    <c:out value="${sessionScope.name}"></c:out><br /><br />
    <c:out value="${applicationScope.name}"></c:out><br /><br />
    <!-- param 是从原始请求哪里取数据 -->
    ${param.username}<br /><br />
    ${requestScope.name}<br /><br />
    ${sessionScope.name}<br /><br />
    ${applicationScope.name}<br /><br />
    <!-- 只写name 默认是从request里面取,从小到大的范围去搜索数据 -->
    <!-- 从小到大的范围搜索数据
               范围:
            pageContext   当前页面有效
            request       当前请求有效,一次请求可能会经过多个servlet或者jsp
            session       当前客户端有效,同一个浏览器,同一个用户,不管发起多少次请求,数据都是有效的
            application   所有的页面,所有的客户端,都能看到的数据,就放到application里面
                查找数据顺序:
             pageContext -> request -> session -> application
    -->
    ${name}
    <c:choose>
             <c:when test="${ age > 30 }"> 30 啦</c:when>
             <c:when test="${ name eq 'admin' }">opop</c:when>
             <c:otherwise>123</c:otherwise>
    </c:choose>
    </body>
    </html>
    
    5)testSession.jsp
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
    "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    ${sessionScope.name}
    </body>
    </html>
    

    4、Servlet 传参数到jsp页面

    request.setAttribute("name", "admin");
    request.getSession().setAttribute("name", "Tom");
    request.getSession().getServletContext().setAttribute("name", "alex");
    

    5、jsp 获取Servlet 传递过来的值

    1)方式一

    在jsp页面中写java代码

    <% 
    //不推荐在jsp中写Java代码,不易于维护
    //页面数据处理,推荐使用JSTL 和 EL 表达式
    String name = (String)request.getAttribute("name");
    out.println("欢迎," + name);
    %>
    
    2)方式二

    在jsp页面中使用EL表达式

    <!-- param 是从原始请求哪里取数据 -->
    ${param.username}<br /><br />
    ${requestScope.name}<br /><br />
    ${sessionScope.name}<br /><br />
    ${applicationScope.name}<br /><br />
    

    只写name 默认是从request里面取,从小到大的范围去搜索数据
    从小到大的范围搜索数据

    范围

    范围
    pageContext 当前页面有效
    request 当前请求有效,一次请求可能会经过多个servlet或者jsp
    session 当前客户端有效,同一个浏览器,同一个用户,不管发起多少次请求,数据都是有效的
    application 所有的页面,所有的客户端,都能看到的数据,就放到application里面

    查找数据顺序
    pageContext -> request -> session -> application

    6、jsp页面写css代码

    1)方式一
    <p style="width: 5rem;">哈哈哈 </p>
    
    2)方式二
    <p align="center" width="80%">嘿嘿嘿</p>
    
    3)方式三
    <style type="text/css">
         body {
                padding: 0px;
                margin: 0px;
            }
    </style>
    
    4)方式四
    <link rel="stylesheet" href="css/success.css">
    

    7、jsp页面写js代码

    1)方式一
    <script type="text/javascript">
    
    </script>
    
    2)方式二
    <script type="text/javascript" 
    src="${pageContext.request.contextPath}/js/jquery.min.js"></script>
    

    8、jsp页面写JSTL语法

    在jsp页面中,不推荐使用java代码,不方便维护
    页面数据处理,推荐使用JSTL 和 EL 表达式

    1)添加jar包

    jstl.jar
    standard.jar
    复制到lib文件夹下,Build Path


    2)jsp页面添加taglib指令
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
    3)JSTL写法
    <c:choose>
        <c:when test="${ age > 30 }"> 30 啦</c:when>
        <c:when test="${ name eq 'admin' }">opop</c:when>
        <c:otherwise>123</c:otherwise>
    </c:choose>
    

    9、jsp 页面 session

    课堂演示

    1)第一步

    Login.jsp 数据提交到 LoginServlet

    2)第二步

    LoginServlet 把数据存到session里面,转发到success.jsp页面
    request.getSession().setAttribute("name", "Tom");

    3)第三步

    直接访问testsession.jsp页面,看看能不能从session中取出数据来
    ${sessionScope.name}

    相关文章

      网友评论

          本文标题:黑猴子的家:JavaWeb 之 JSP

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