B033-Servlet交互 JSP

目录

      • Servlet
        • Servlet的三大职责
        • 跳转:请求转发和重定向
        • 请求转发
        • 重定向
        • 汇总
        • 请求转发与重定向的区别
        • 用请求转发和重定向完善登录
      • JSP
        • 第一个JSP
          • 概述
          • 注释
          • 设置创建JSP文件默认字符编码集
        • JSP的java代码书写
        • JSP的原理
        • 三大指令
        • 九大内置对象
          • 改造动态web工程进行示例
          • 内置对象名称来源?
          • 名单列表
        • 四大作用域
          • 概述
          • 案例测试
          • 登录完善

Servlet

Servlet的三大职责

1.接受参数 --> req.getParameter (非必须)
2.处理业务 --> 拿到数据后去做一些事情(非必须)
3.跳转(必须)–> 操作完的一个结果 两句代码

跳转:请求转发和重定向

在这里插入图片描述

请求转发

案例演示:动态web项目

AServlet

@WebServlet("/go/a")
public class AServlet extends HttpServlet{@Overrideprotected 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

@WebServlet("/go/b")
public class BServlet extends HttpServlet{@Overrideprotected 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

@WebServlet("/go/c")
public class CServlet extends HttpServlet{@Overrideprotected 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

@WebServlet("/go/d")
public class DServlet extends HttpServlet{@Overrideprotected 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

@WebServlet("/go/e")
public class EServlet extends HttpServlet{@Overrideprotected 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

@WebServlet("/go/f")
public class FServlet extends HttpServlet{@Overrideprotected 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

<!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

@WebServlet("/loginTest")
public class LoginServletTest extends HttpServlet{@Overrideprotected 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

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

AAAServlet

@WebServlet("/AAAServlet")
public class AAAServlet  extends HttpServlet{@Overrideprotected 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

<%@ 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代码书写
<%@ 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文件时会引用这些配置

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

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

3.include:引用一个文件,常用于导航栏
在这里插入图片描述
_03include.jsp

<%@ 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

<%@ 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

<%@ 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

@WebServlet("/loginTest")
public class LoginServletTest extends HttpServlet{@Overrideprotected 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

<%@ 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

<%@ 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

<%@ 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

<%@ 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

<%@ 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

<%@ 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

<%@ 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作用域

@WebServlet("/loginTest")
public class LoginServletTest extends HttpServlet{@Overrideprotected 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

<%@ 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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/209186.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

猫罐头多久喂一次?好用的猫罐头牌子推荐

猫爱吃猫罐头&#xff0c;包含各种美味&#xff0c;提供营养和口感。但喂猫吃罐头需技巧和耐心&#xff0c;以确保猫健康快乐成长。 作为一个从业宠物营养师7年的人&#xff0c;可以说对于猫咪的食物很有研究和猫罐头品牌选购上&#xff0c;我有自己的见解。 一、猫罐头多久喂…

第四代智能井盖传感器:智能井盖位移监测

当城市道路上的井盖出现异常时&#xff0c;可能会导致突发的交通事故或人员受伤事件。而传统的井盖监测往往依靠人力进行巡查&#xff0c;这种方式可能会因为监测不及时或不准确而带来问题。但是现在有了智能井盖传感器&#xff0c;它们成为了城市地下生命线的守护者。这种智能…

【数据库】数据库中的检查点Checkpoint,数据落盘的重要时刻

检查点(checkpoint) ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏会定…

JSP编写自己的第一个WebServlet实现客户端与服务端交互

我们在项目中找到java目录 下面有一个包路径 然后 我们在下面创建一个类 我这里叫 TransmissionTest 当然 名字是顺便取的 参考代码如下 package com.example.dom;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet…

《微信小程序开发从入门到实战》学习二十五

3.3 开发创建投票页面 3.3.13 使用页面路径参数 写了很多重复代码&#xff0c;现在想办法将多选和单选投票页面合二为一。 将单选页面改造作为单选多选共同页面。 修改index.js中的代码&#xff0c;将路径都跳转到第一个单选页面&#xff0c;带上单选或多选的标志&#xff…

redis---非关系型数据库

关系数据库与非关系型数据库 redis非关系型数据库&#xff0c;又名缓存型数据库。数据库类型&#xff1a;关系型数据库和非关系型数据库关系型数据库是一 个机构化的数据库,行和列。 列&#xff1a;声明对象。 行&#xff1a;记录对象属性。 表与表之间的的关联。 sql语句&…

Nginx配置文件中的关键字是什么?详细解释来了

点击上方蓝字关注我 Nginx 是一款高性能的 Web 服务器软件&#xff0c;同时也是一款反向代理服务器软件。Nginx 的配置文件通常是 /etc/nginx/nginx.conf&#xff0c;以下是一个典型的配置文件&#xff0c;并对其中的关键字进行详细解释。 1. 配置文件 perlCopy codeuser ngin…

Springboot_文件下载功能(前端后端)

遇到的问题&#xff1a; 文件下载后文件一直被破坏&#xff0c;无法正常打开文件名乱码&#xff0c;如图 刚开始一直在纠结&#xff0c;是不是后端没有写对&#xff0c;然后导致下载不能使用 后来搜索了一些资料&#xff0c;发现后端没什么问题 然后就开始找到其他项目对比…

在线接口测试工具fastmock使用

1、fastmock线上数据模拟器 在平时的项目测试中&#xff0c;尤其是前后端分离的时候&#xff0c;前端人员需要测试调用后端的接口&#xff0c;这个时候会出现测试不方便的情况。此时我们可以使用fastmock平台在线上模拟出一个可以调用的接口&#xff0c;方便前端人员进行数据测…

智能监控,高效观测 IT 系统瓶颈

前言 云原生时代的监控系统贯穿于移动端、前端、业务服务端、中间件、应用层、操作系统等&#xff0c;渗透 IT 系统的各个环节。因此&#xff0c;在构建 IT 系统之初&#xff0c;就需要考虑如何打造一个完善的监控系统。当面临大量业务流量数据时&#xff0c;借助监控进行问题…

设计模式-16-Spring源码中的设计模式

1-Spring之观察者模式 Java、Google Guava都提供了观察者模式的实现框架。Java提供的框架比较简单&#xff0c;只包含java.util.Observable和java.util.Observer两个类。Google Guava提供的框架功能比较完善和强大&#xff1a;通过EventBus事件总线来实现观察者模式。实际上&am…

生成式AI与大语言模型,东软已经准备就绪

伴随着ChatGPT的火爆全球&#xff0c;数以百计的大语言模型也争先恐后地加入了这一战局&#xff0c;掀起了一场轰轰烈烈的“百模大战”。毋庸置疑的是&#xff0c;继方兴未艾的人工智能普及大潮之后&#xff0c;生成式AI与大语言模型正在全球开启新一轮生产力革新的科技浪潮。 …