Servlet详解/异常处理/跟踪用户的4种方法

news/2024/3/29 18:18:35/文章来源:https://blog.csdn.net/qq_51222096/article/details/128086694

文章目录

  • 异常处理
    • web页面之间的3种关系
      • 包含
    • 重定向和请求转发
      • 区别【重点】
      • 典型应用
      • 跟踪用户的4种方法
      • 会话对象

异常处理

web页面之间的3种关系

web页面之间的关系有3种:包含、重定向和请求转发

包含

包含就是在一个页面的生成结果中包含另外一个页面。包含可以有静态包含和动态包含两种

  • 静态包含就是将被包含页的源代码先复制到包含页中,再编译执行
    page1.jsp被包含页
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
this is page one!<br/>
<% int kk=100; %>

page2.jsp包含页,在page2中包含page1的内容

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
this is page two begin...<br/>
<%@ include file="page1.jsp"%> 静态包含,先包含后编译执行
this is page two end...<br/>
<%=kk%> 如果没有包含page1则kk变量没有定义,语法错误
  • 动态包含就是包含被包含页面的执行结果,并不包含源代码。两个页面实际上是各自独立运行的

上面的编码方式则不可用,因为page2中的 kk没有定义而直接使用,语法错误
page1.jsp被包含页

<%@ page contentType="text/html;charset=UTF-8" language="java" %>this is page one!<br/>
<% int kk=100; %>

page2.jsp包含页,在page2中包含page1的独立执行结果,就是包含生成的html文档

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
this is page 3 begin...<br/>
<jsp:include page="page1.jsp"/>
this is page 3 end...<br/>
<%=kk%> 编译失败,HTTP Status 500 - Unable to compile class for JSP

在servlet中编程实现动态包含
//动态包含page1.jsp页面
request.getRequestDispatcher("page1.jsp").include(request,response);
包含方法中传递了request和response对象,所以当前Servlet和被包含的页面共享request和response对象

重定向和请求转发

效果类似,可以从一个页面跳转到另外一个页面
请求转发就是将请求的处理委托给另外一个页面进行处理;重定向就是重新向另外一个页面发起请求
请求转发:

request.getRequestDispatcher("page1.jsp").forward(request,response);

重定向:

response.sendRedirect("show.do");

区别【重点】

  • 是否共享request,请求转发共享,重定向不共享
  • 客户端是否参与。请求转发客户端不参与,浏览器中的地址不会发生变化;重定向客户端参与,浏览器中的地址自动变化为新地址
  • 允许跳转的目标地址
    选用
  • 如果请求转发和重定向都可以的时候,优先使用请求转发,因为效率
  • 如果需要使用request传递共享数据,则需要使用请求转发,否则使用重定向

典型应用

用户登录login.jsp

<form action="login.do" method="post">
<input name="username"/>
<input name="password" type="password"/>
<input type="submit" value="登录系统"/>
</form>

在地址为login.do的servlet中接收数据

public class LoginServlet extends HttpServlet {
public void doPost(HttpServletRequest request,HttpServletResponse
response)throws ServletException,IOException {
String username=request.getParameter("username");
String password=request.getParameter("password");
//需要对用户提交的数据进行验证
Map<String,String> errs=new HashMap<>();
if(username==null || username.trim().length()<6){ //要求用户名称必须填
写,并且长度不能少于6个字符
errs.put("username","用户名称不合法!");
}
if(password==null || password.trim().length()<6){
errs.put("password","用户口令不合法!");
}
//如果有报错信息则需要返回到输入页面中进行报错显示。报错信息可以使用request的
attribute进行传递,同时使用请求转发保证实现页面的数据回填操作
if(errs.size()>0){
request.setAttribute("errors",errs);
request.getRequestDispatcher("login.jsp").forward(request,response);
return; //如果提前执行页面跳转,则必须紧邻return,以保证后续代码不执行
}
... ...
}
}

修改login.jsp页面实现报错信息显示和数据回填操作

<%
Object obj=request.getAttribute("errors");
if(obj!=null && obj instanceof Map){
Map<String,String> map=(Map<String,String>)obj;
if(map.containsKey("username")){ //判断保存报错信息的Map种是否有username对应
的报错信息
out.println(map.get("username"))
}
}
%>
如果用户输入的正确信息,则不应该要求用户重新输入,所以需要从request种获取上次提交的数据---
数据回填操作
<input name="username" value='<%=request.getParameter("username")%>'/>

跟踪用户的4种方法

  • 隐藏域
  • URL重写
  • 客户端跟踪用户:Cookie
  • 服务器端跟踪用户:session

会话对象

session对应类型为HttpSession,用于实现服务器端跟踪用户。一般针对一个浏览器窗口,服务器会提供一个session对象,不管在这个浏览器窗口中以何种方式访问当前应用中的多少的页面,这些页面都共享同一个session对象
获取session对象

HttpSession session=request.getSession(true); //Boolean类型的参数,如果值为
true,则表示有当前窗口对应的session对象,则获取并重用;如果没有则新建。值为false则有则重
用,没有返回为null,不会自动新建
HttpSession session=request.getSession(); //等价于getSession(true)

操作数据
setAttribute(“名称”,存放的值Object) 存储或者修改session中存储的数据
getAttribute(“名称”):Object 获取存储在session中指定名称对应的数据
removeAttribute(“名称”) 删除指定名称对应的数据
getAttibuteNames():Enumeration<String>
具体应用
应用场景1:跨多个页面传递数据
PicServlet负责生成图片

String checkcode=this.generateCheckcode(6); //生成验证码
HttpSession session=request.getSession();
session.setAttribute("checkcode",checkcode);//在session中存储了验证码

LoginServlet中接收客户端输入的验证码,并和session中存储的验证码进行比对,以判断用户输入的验证码是否正确

String checkcode=request.getParameter("checkcode");
HttpSession session= request.getSession();
if(checkcode==null || checkcode.trim().length()<1)
errs.put("checkcode","必须输入校验码!");
else{
//如何判断验证码输入正确?要求PicServlet能够以某种方式将动态成成的验证码传递到
LoginServlet
Object obj=session.getAttribute("checkcode");
if(obj!=null && !checkcode.endsWith(obj.toString()))
errs.put("checkcode","验证码输入错误!");
session.removeAttribute("checkcode");
}

应用场景2:使用session标识当前用户状态,并跨页面数据传输

boolean bb= userDao.login(user);
if(bb){
session.setAttribute("loginInfo",user); //用于标识当前窗口的用户已经登录成功
//登录成功后,则没有必要继续向下传递login.jsp页面提交的用户名称和口令,所以考虑使用重
定向
response.sendRedirect("show.do");
}else {
//因为登录失败后返回原始的输入页面login.jsp,需要对用户输入的数据进行回填处理,供用户
修改再次登录
request.setAttribute("msg","登录失败!请重新登录");
request.getRequestDispatcher("login.jsp").forward(request,response);
}

在需要判断用户是否登录的servlet中首先判断用户的登录状态

public class ShowServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
HttpSession session = request.getSession();
Object obj = session.getAttribute("loginInfo");
if (obj == null) {
session.setAttribute("msg","请登录后使用本系统");
response.sendRedirect("login.do");
} else {
request.getRequestDispatcher("show.jsp").forward(request,
response);
}
}
}

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

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

相关文章

springboot+java+vue大学生求职招聘就业岗位匹配推荐系统

目 使用人职匹配推荐系统分为管理员和用户、企业三个权限子模块。 管理员所能使用的功能主要有&#xff1a;首页、个人中心、用户管理、企业管理、岗位信息管理、岗位类型管理、应聘信息管理、应聘状况管理、平台费用管理、系统管理等。 用户可以实现&#xff1b;首页、个人中…

GFS分布式

GFS是什么&#xff1f; 1.1 简单介绍 这个问题说大也大&#xff0c;说小也小。GFS是Google File System的缩写&#xff0c;字面意义上就是Google的文件系统&#xff0c;技术层面上来讲&#xff0c;GFS是Google在2003年前后创建的可扩展分布式文件系统 &#xff0c;用来满足 Goo…

【visual studio】visual studio 2022 无法 复制黏贴

visual studio 2022 cannot copy paste 其他网友也有反馈到微软&#xff1a;VS 2022 Copy and Paste form feature Broken?Copy paste still not fixed in Visual studio 2022表现是突然就无法复制和黏贴了其他的app 就没有这个问题每次都是重启电脑解决。 2022年11月fix 今…

2.1 Redis中SDS的定义

每个sds.h/sdshdr 结构表示一个SDS值 struct sdshdr { //记录 buf 数组中已经使用的字节数量 //等于SDS所保存字符串的长度 int len;//记录buf数组中未使用字节的数量 int free;//字节数组,用于保存字符串 char buf[]; };图2-1 展示了一个SDS 示例: 1、free 属性值为0&#x…

【Spring项目中的Controller理解】

目录 1. 添加依赖 2. 关于异常 1. 添加依赖 首先&#xff0c;需要保障此项目中存在spring-boot-starter-web依赖项&#xff0c;否则&#xff0c;当前项目并不具备Web应用程序开发所需的依赖&#xff01; 提示&#xff1a;spring-boot-starter-web是建立在spring-boot-starte…

APS智能排产系统的优势

APS智能排产系统是通过同步考虑多种有限能力资源的约束&#xff0c;依据各种预设规则&#xff0c;针对解决&#xff1a;客户订单交期评估与答复、人工排产效率低、设备资源利用率低、物料计划与生产计划脱节、生产计划执行率低、库存积压与生产缺料等相关问题&#xff0c;依靠严…

安科瑞智能余压监控系统余压控制器ARPM-C 监控余压值/接收报警信息

1、概述 ARPM-C型余压控制器&#xff0c;可监控所连接余压探测器的余压值&#xff0c;接收余压探测器的报警信息&#xff0c;并向余压监控器反馈现场工作状态&#xff0c;当余压过高报警时联动风阀执行器调节泄压阀&#xff0c;能够持续调节泄压阀的开启角度。 2、产品型号 …

5G无线技术基础自学系列 | MIMO功能

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 无线通信的迅速发展对系统的容量和频谱…

Linux学习笔记(二)

命令 目录中找文件&#xff1a;find压缩tar&#xff1a;tar -cvf xxx.tar 文件解压缩tar&#xff1a;tar -xvf xxx.tar解压缩.gz文件&#xff1a;tar -zxvf xxx.tar.gz压缩.bz2文件&#xff1a;tar -jcvf xxx.tar.bz2解压到指定目录&#xff1a;tar -C 指定目录压缩zip&#xf…

Ensp用windows回环口连接cloud配置

Ensp模拟通过本机&#xff08;windows&#xff09;用python脚本批量配置华为数通设备时&#xff0c;为了避免对内网资源的浪费最好用回环口&#xff08;loopback&#xff09;。 一、windows开启loopback虚拟接口 概要&#xff1a; right click on window start menu icon an…

进阶自动化测试,你一定要知道的...

自动化测试指软件测试的自动化&#xff0c;在预设状态下运行应用程序或系统&#xff0c;预设条件包括正常和异常&#xff0c;最后评估运行结果。将人为驱动的测试行为转化为机器执行的过程。 自动化测试框架一般可以分为两个层次&#xff0c;上层是管理整个自动化测试的开发&a…

nodejs+vue音乐网站与分享平台

目 录 摘 要 I 1 绪论 1 1.1研究背景 1 1.2研究现状 1 1.3研究内容 2 2 系统关键技术 3 2.1 Spring Boot框架 3 2.2 JAVA技术 3 2.3 MYSQL数据库 4 2.4 B/S结构 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2经济可行性…

SpringBoot+html+vue模板开发

除了对某个表基本的增删改查以外&#xff0c;可能需要额外的增加操作&#xff0c;这里是通过按钮来实现的 1、新增一个测试按钮 <el-button type"primary" class"butT" click"test()">测试</el-button> 2、这个按钮绑定一个方法t…

线代 | 【提神醒脑】自用笔记串联三 —— 相似对角化 · 二次型 · 合同变换

本文总结参考于 kira 2023 线代提神醒脑技巧班。 笔记均为自用整理。加油!ヾ(◍∇◍)ノ゙ 九、相似对角化 9.1、矩阵相似的性质 ----------------------------------------------------------------------------------------------------------…

R语言基于决策树的银行信贷风险预警模型

引言 我国经济高速发展&#xff0c;个人信贷业务也随着快速发展&#xff0c;而个人信贷业务对提高内需&#xff0c;促进消费也有拉动作用。有正必有反&#xff0c;在个人信贷业务规模不断扩大的同时&#xff0c;信贷的违约等风险问题也日益突出&#xff0c;一定程度上制约着我…

运维行业数字化维修数据屏来袭

说起维修数字化&#xff0c;售后维保管理&#xff0c;大家必然想到青鸟云报修&#xff0c;今天我给大家呈现一下青鸟云报修数据大屏是怎么一回事。 这是青鸟云报修第三代数据大屏&#xff0c;在2代基础上增加了更多板块&#xff0c;更加专业和智能化&#xff0c;他主要应用于单…

传奇战盟GOM引擎登录器配置教程

战盟GOM引擎配置器教程&#xff0c;先到战盟官方网站下载登录器配置器&#xff0c;下载好后按下面说明使用。战盟GOM登录器教程大分类目录引导说明 一、解压配置器文件包后&#xff0c;打开KEY文件夹然后选择KEY 二、复制你选择好的 Key.Lic 复制到 战盟GOM配置器 相同路径文件…

AI强势入场,成就史上最快足球

众所周知&#xff0c;卡塔尔是全球最富裕的国度之一&#xff0c;是世界第一大液化天然气生成和出口国。丰富的石油资源&#xff0c;几乎让每一名原住民从出生之日起就实现财务自由&#xff0c;人均GDP高达6万多美元&#xff0c;钞能力毋庸置疑。 2022年世界杯正是在这片富饶的土…

mac上的python2安装

iiPython Release Python 2.7.18rc1 | Python.orgThe official home of the Python Programming Languagehttps://www.python.org/downloads/release/python-2718rc1/不小心把mac上的python2给删除了&#xff0c;发现老的nodejs项目需要pytho2&#xff0c;这下晕了&#xff0c;…

xss-labs/level12

这一关首先尝试以下 <script>alert(xss)</script> 不废话 直接看源代码 很明显发现第一个输出点被转义了 根本无法通过script标签来完成弹窗 然后依然是四个隐藏表单 我们可以先试一试在不用抓包工具的前提下 我们能不能将某个隐藏表单给显示出来 构造如下 &l…