B033-Servlet交互 JSP

目录

Servlet

Servlet的三大职责

1.接受参数 --> req.getParameter (非必须)

2.处理业务 --> 拿到数据后去做一些事情(非必须)

3.跳转(必须)--> 操作完的一个结果 两句代码

跳转:请求转发和重定向
请求转发

案例演示:动态web项目

AServlet

java 复制代码
@WebServlet("/go/a")
public class AServlet extends HttpServlet{
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("AServlet");
		
		String name = req.getParameter("name");
		System.out.println("A-name: "+name);
		
		req.setAttribute("password", "123456");
		
        // 请求转发
		req.getRequestDispatcher("/go/b").forward(req, resp);
	}
}

BServlet

java 复制代码
@WebServlet("/go/b")
public class BServlet extends HttpServlet{

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("BServlet");
		
		String name = req.getParameter("name");
		System.out.println("B-name: "+name);
		
		String password = (String) req.getAttribute("password");
		System.out.println("B-password: "+password);
	}
}

浏览器访问:http://localhost/go/a?name=zhangsan

控制台:

AServlet
A-name: zhangsan
BServlet
B-name: zhangsan
B-password: 123456

req.getRequestDispatcher("路径").forward(request, response); ,请求里的东西,forward可以理解为携带

带值跳转,可以访问WEB-INF中资源,地址栏不改变

发送一次请求,最后一个response起作用,不可以跨域[跨网站]访问

重定向

案例演示:动态web项目

CServlet

java 复制代码
@WebServlet("/go/c")
public class CServlet extends HttpServlet{

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("CServlet");
		
		String name = req.getParameter("name");
		System.out.println("C-name: "+name);
		
		resp.sendRedirect("/go/d");
	}
}

DServlet

java 复制代码
@WebServlet("/go/d")
public class DServlet extends HttpServlet{

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("DServlet");
		
		String name = req.getParameter("name");
		System.out.println("D-name: "+name);
	}
}

浏览器访问:http://localhost/go/c?name=zhangsan

控制台:

CServlet
C-name: zhangsan
DServlet
D-name: null

resp.sendRedirect("路径") ,响应里的东西,可以有避免重复扣款和访问外部网站之类的作用

无法带值,不能访问WEB-INF下内容,地址栏改变

两次请求,起作用的依然是最后一个,可以跨域访问

汇总
请求转发与重定向的区别

请求转发的特点:可以携带参数,只用一次请求,可以访问WEB-INF

重定向的特点:可以避免重复扣款场景风险,可以访问外部网站,不能访问WEB-INF

请求转发过程:浏览器 - 内部代码 - WEB-INF

重定向过程:浏览器 - 内部代码 - 浏览器 - URL

动态web项目示例:

EServlet

java 复制代码
@WebServlet("/go/e")
public class EServlet extends HttpServlet{

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("EServlet");
		
		System.out.println("E----扣款1000");
		
//		req.getRequestDispatcher("/go/f").forward(req, resp);
//		resp.sendRedirect("/go/f");
//		resp.sendRedirect("https://www.fu365.com/");
		
//		req.getRequestDispatcher("/WEB-INF/haha.html").forward(req, resp);
//		resp.sendRedirect("/WEB-INF/haha.html");
	}
}

FServlet

java 复制代码
@WebServlet("/go/f")
public class FServlet extends HttpServlet{

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("FServlet");
	}
}

WEB-INF下新建haha.html

浏览器访问:http://localhost/go/e

用请求转发和重定向完善登录

webapp下WEB-INF外新建login.html

html 复制代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="/loginTest" method="post">
		账号:<input type="text" name="name"><br>
		密码:<input type="password" name="password">
		<input type="submit" value="post">
	</form>
</body>
</html>

loginTest

java 复制代码
@WebServlet("/loginTest")
public class LoginServletTest extends HttpServlet{
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html;charset=utf-8");
		
		String name = req.getParameter("name");
		String password = req.getParameter("password");
		
		if ( name.equals("zhangsan") && password.equals("123456") ) {
			resp.sendRedirect("main.html");		//这里在WEB-INF外重定向可以访问
		} else {
			req.setAttribute("msg", "登录失败");
			// 需要访问另外一个servlet,把参数传进页面打印出来
			req.getRequestDispatcher("/AAAServlet").forward(req, resp);
		}
	}
}

main.html

html 复制代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>登录成功</h1>
</body>
</html>

AAAServlet

java 复制代码
@WebServlet("/AAAServlet")
public class AAAServlet  extends HttpServlet{
  	@Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	
	  Object attribute = req.getAttribute("msg");
	  System.out.println(attribute);
	  
	  PrintWriter writer = resp.getWriter();
	  writer.print("<!DOCTYPE html>");
	  writer.print("<html>");
	  writer.print("<head>");
	  writer.print("<meta charset=\"UTF-8\">");
	  writer.print("<title>Insert title here</title>");
	  writer.print("</head>");
	  writer.print("<body>");
	  writer.print(attribute);
	  writer.print("   <form action=\"/loginTest\" method=\"post\">");
	  writer.print("     账号:<input type=\"text\" name=\"username\"><br>");
	  writer.print("     密码:<input type=\"password\" name=\"password\"><br>");
	  writer.print("     <input type=\"submit\" value=\"post\">");
	  writer.print("   </form>");
	  writer.print("</body>");
	  writer.print("</html>");
  }
}

JSP

第一个JSP
概述

servlet:是用来写java代码的,也可以用来做页面展示(把html代码一行一行打印出去),但是不擅长做页面展示。

html:用来做页面展示,静态网页,没办法拿到Java代码,不能展示数据。

jsp:看起来像html,但是它里面可以写java代码(动态网页)。

注释

webapp下新建_01hello.jsp

html 复制代码
<%@ 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>

	<!-- 不安全的注释,能在控制台看到 -->
	<%-- 安全的注释,不能再控制台看到 --%>
	<h1>我是第一个JSP</h1>
</body>
</html>
设置创建JSP文件默认字符编码集

JSP文件内右键 - Preferences - utf-8

JSP的java代码书写
html 复制代码
<%@ 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>
        <!-- jsp写java代码的第一种方式,打印到后端控制台 -->
            <%
                for(int i = 0;i<5;i++){
                    System.out.println("i: "+i);
                }

                int b =520;
            %>

        <!-- jsp写java代码的第二种方式,显示在页面上 -->
            <%=b %>

        <!-- jsp写java代码的第三种方式,涉及JSP的底层原理 -->
            <%!
            String ss ="abc";
            // System.out.println("abc: "+ss);
            %>
    </body>
</html>
JSP的原理

jsp需要tomcat运行才能正常展示内容

访问JSP - tomcat的web.xml - 两个servlet类(把JSP转化为servlet/java文件,把html代码打印出去)

tips:tomcat的web.xml是全局的,项目中的web.xml是局部的

三大指令

1.page :当前页面的一些配置,jsp生成java文件时会引用这些配置

html 复制代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

2.taglib:不讲 (下一节来说 )

3.include:引用一个文件,常用于导航栏

_03include.jsp

html 复制代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@include file="head.jsp" %>
<!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>
	<div>螺旋丸</div>
</body>
</html>

_04include.jsp

html 复制代码
<%@ 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>
	<div>千年杀</div>
	<%@include file="head.jsp" %>
</body>
</html>

head.jsp

html 复制代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
	<div style="background-color:red;text-align:center;font-size:50px">火影忍者</div>
九大内置对象
改造动态web工程进行示例

改造LoginServletTest,登录失败后跳转到login.jsp

java 复制代码
@WebServlet("/loginTest")
public class LoginServletTest extends HttpServlet{
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html;charset=utf-8");
		
		String name = req.getParameter("name");
		String password = req.getParameter("password");
		
		if ( name.equals("zhangsan") && password.equals("123456") ) {
			resp.sendRedirect("main.html");		//这里在WEB-INF外重定向可以访问
		} else {
			req.setAttribute("msg", "登录失败");
			// 需要访问另外一个servlet,把参数传进页面打印出来
//			req.getRequestDispatcher("/AAAServlet").forward(req, resp);
			req.getRequestDispatcher("login.jsp").forward(req, resp);
		}
	}
}

webapp下新增login.jsp

html 复制代码
<%@ 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>
	<%=request.getAttribute("msg") %>
	<form action="/loginTest" method="post">
		账号:<input type="text" name="name"><br>
		密码:<input type="password" name="password">
		<input type="submit" value="post">
	</form>
</body>
</html>
内置对象名称来源?

来自tomcat根据jsp生成的java文件,在那里面定义了

名单列表
HttpServletRequest    request  		请求对象    
HttpServletResponse   response 		响应对象
ServletConfig         config      	配置对象
ServletContext      application  
Throwable          	 exception   	异常( 你当前页面是错误页时才有 isErrorPage="true" )
JspWriter         		out    		输出流对象
Object           		page   		相当于this 是当前页的意思
PageContext         pageContext  	没好大用处 
HttpSession           session  		会话对象(重要)
四大作用域
概述
HttpServletRequest  request    一次请求
HttpSession       session      一次会话	同一个浏览器访问tomcat就是一次会话
PageContext    pageContext    	当前页面	作用不大
ServletContext   application     整个会话tomcat没有关闭就不会消失,在不同的浏览器都能拿到
案例测试

webapp下新增_05page.jsp

html 复制代码
<%@ 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>
	<%
    pageContext.setAttribute("iampageContext","我是当前页对象");
	request.setAttribute("iamrequest", "我是请求对象");
	session.setAttribute("iamsession", "我是会话对象");
	application.setAttribute("iamapplication", "我是应用对象");
	%>
	
    <%=pageContext.getAttribute("iampageContext")
    %>
	<%=request.getAttribute("iamrequest")
	%>
	<%=session.getAttribute("iamsession")
	%>	
	<%=application.getAttribute("iamapplication")
	%>
</body>
</html>

webapp下新增_06page.jsp

html 复制代码
<%@ 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>
    <%=pageContext.getAttribute("iampageContext")
    %>
	<%=request.getAttribute("iamrequest")
	%>
	<%=session.getAttribute("iamsession")
	%>	
	<%=application.getAttribute("iamapplication")
	%>
</body>
</html>

启动tomcat,浏览器访问http://localhost/_05page.jsp,我是当前页对象 我是请求对象 我是会话对象 我是应用对象

浏览器访问http://localhost/_06page.jsp,null null 我是会话对象 我是应用对象

换一个浏览器访问http://localhost/_06page.jsp,null null null 我是应用对象

重启原浏览器访问http://localhost/_06page.jsp,null null null 我是应用对象

重启tomcat访问http://localhost/_06page.jsp,null null null null

修改_05page.jsp

html 复制代码
<%@ 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>
	<%
    pageContext.setAttribute("iampageContext","我是当前页对象");
	request.setAttribute("iamrequest", "我是请求对象");
	session.setAttribute("iamsession", "我是会话对象");
	application.setAttribute("iamapplication", "我是应用对象");
	%>
	
	<%
	request.getRequestDispatcher("_06page.jsp").forward(request, response);
	%>
</body>
</html>

启动tomcat,浏览器访问http://localhost/_05page.jsp,null 我是请求对象 我是会话对象 我是应用对象

修改_05page.jsp

html 复制代码
<%@ 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>
	<%
    pageContext.setAttribute("iampageContext","我是当前页对象");
	request.setAttribute("iamrequest", "我是请求对象");
	session.setAttribute("iamsession", "我是会话对象");
	application.setAttribute("iamapplication", "我是应用对象");
	%>
	
	<%
	//request.getRequestDispatcher("_06page.jsp").forward(request, response);
	response.sendRedirect("_06page.jsp");
	%>
</body>
</html>

启动tomcat,浏览器访问http://localhost/_05page.jsp,null null 我是会话对象 我是应用对象

修改_06page.jsp

html 复制代码
<%@ 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>
    <%=pageContext.getAttribute("iampageContext")
    %>
	<%=request.getAttribute("iamrequest")
	%>
	<%=session.getAttribute("iamsession")
	%>	
	<%=application.getAttribute("iamapplication")
	%>
	
	<%
	request.getRequestDispatcher("_05page.jsp").forward(request, response);
	%>
</body>
</html>

启动tomcat,浏览器访问http://localhost/_05page.jsp,报错:该网页无法正常运作,localhost将您重定向的次数过多。

登录完善

改造login.jsp

html 复制代码
<%@ 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>
	<%
	if(request.getAttribute("msg")!=null){ %>
	<%=request.getAttribute("msg") %>
	<%} %>
	<form action="/loginTest" method="post">
		账号:<input type="text" name="name"><br>
		密码:<input type="password" name="password">
		<input type="submit" value="post">
	</form>
</body>
</html>

LoginServletTest设置数据到session作用域

java 复制代码
@WebServlet("/loginTest")
public class LoginServletTest extends HttpServlet{
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		ServletContext servletContext = req.getServletContext();
		HttpSession session = req.getSession();
		
		
		req.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html;charset=utf-8");
		
		String name = req.getParameter("name");
		String password = req.getParameter("password");
		
		if ( name.equals("zhangsan") && password.equals("123456") ) {
			session.setAttribute("name", "zhangsan");
			resp.sendRedirect("main.jsp");		//这里在WEB-INF外重定向可以访问
		} else {
			req.setAttribute("msg", "登录失败");
			// 需要访问另外一个servlet,把参数传进页面打印出来
//			req.getRequestDispatcher("/AAAServlet").forward(req, resp);
			req.getRequestDispatcher("login.jsp").forward(req, resp);
		}
	}
}

新建main.jsp

html 复制代码
<%@ 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>
恭喜你登录成功<%=session.getAttribute("name")%>
</body>
</html>
相关推荐
blammmp14 分钟前
Java:数据结构-枚举
java·开发语言·数据结构
暗黑起源喵33 分钟前
设计模式-工厂设计模式
java·开发语言·设计模式
WaaTong38 分钟前
Java反射
java·开发语言·反射
九圣残炎1 小时前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
wclass-zhengge1 小时前
Netty篇(入门编程)
java·linux·服务器
Re.不晚2 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
雷神乐乐2 小时前
Maven学习——创建Maven的Java和Web工程,并运行在Tomcat上
java·maven
码农派大星。2 小时前
Spring Boot 配置文件
java·spring boot·后端
顾北川_野2 小时前
Android 手机设备的OEM-unlock解锁 和 adb push文件
android·java
江深竹静,一苇以航2 小时前
springboot3项目整合Mybatis-plus启动项目报错:Invalid bean definition with name ‘xxxMapper‘
java·spring boot