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"%>
Insert title here
failure
<% exception.equals("e"); %>
3)login.jsp
<%-- JSP 注释 --%>
<%-- page指令:用于设置当前页面 --%>
<%-- taglib指令:用于加载标签库 --%>
<%-- include指令:用于包含其它页面 --%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
Insert title here
Get
POST
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" %>
Insert title here
success
<%
//不推荐在jsp中写Java代码,不易于维护
//页面数据处理,推荐使用JSTL 和 EL 表达式
String name = (String)request.getAttribute("name");
out.println("欢迎," + name);
%>
${param.username}
${requestScope.name}
${sessionScope.name}
${applicationScope.name}
${name}
30 啦
opop
123
5)testSession.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
${sessionScope.name}
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.username}
${requestScope.name}
${sessionScope.name}
${applicationScope.name}
只写name 默认是从request里面取,从小到大的范围去搜索数据
从小到大的范围搜索数据
范围
范围 | |
---|---|
pageContext | 当前页面有效 |
request | 当前请求有效,一次请求可能会经过多个servlet或者jsp |
session | 当前客户端有效,同一个浏览器,同一个用户,不管发起多少次请求,数据都是有效的 |
application | 所有的页面,所有的客户端,都能看到的数据,就放到application里面 |
查找数据顺序
pageContext -> request -> session -> application
6、jsp页面写css代码
1)方式一
哈哈哈
2)方式二
嘿嘿嘿
3)方式三
4)方式四
7、jsp页面写js代码
1)方式一
2)方式二
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写法
30 啦
opop
123
9、jsp 页面 session
课堂演示
1)第一步
Login.jsp 数据提交到 LoginServlet
2)第二步
LoginServlet 把数据存到session里面,转发到success.jsp页面
request.getSession().setAttribute("name", "Tom");
3)第三步
直接访问testsession.jsp页面,看看能不能从session中取出数据来
${sessionScope.name}