黑猴子的家:JavaWeb 之 JSP

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}

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

推荐阅读更多精彩内容

  • JSP总结(经典) day1 JSP 定义: 1)Java Server Page, Java EE 组件,本...
    java日记阅读 3,310评论 0 13
  • Jsp技术总结 1. 什么是JSP JSP即Java Server Pages,它和servlet技术一样...
    java日记阅读 1,593评论 0 18
  • 1.学习内容 JSP技术入门和常用指令 JSP的内置对象&标签介绍 EL表达式&EL的内置对象 2.JSP技术入门...
    WendyVIV阅读 2,035评论 1 18
  • Web应用程序 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源。Inte...
    陈先森mansplain阅读 2,303评论 1 4
  • 一、jsp介绍 jsp作用jsp全称java server pages(java服务器页面),本质是一个servl...
    圣贤与无赖阅读 1,211评论 0 14