【Java Web】JSP实现数据传递和保存(中)中文乱码 转发与重定向

文章目录

    • 中文乱码
    • 转发与重定向
      • 转发
      • 重定向
      • 区别
    • 升级示例1

中文乱码

JSP 中默认使用的字符编码方式:iso-8859-1,不支持中文。常见的支持中文的编码方式及其收录的字符:

  • gb2312:常用简体汉字
  • gbk:简体和繁体汉字
  • utf-8:所有国家需要的字符

在 Java Web 应用程序中处理字符编码问题的几种方法

设置请求和响应的编码方式

// 请求乱码:指定从客户端发送到服务器的数据(如表单提交)的字符编码
request.setCharacterEncoding("utf-8");
// 响应乱码:设置响应给客户端的 HTTP 内容的字符编码
response.setCharacterEncoding("utf-8");
<% // 在JSP页面顶部使用的指令,告诉浏览器以 UTF-8 格式解析页面%>
<%@ page language="java" contentType="text/html; charset=utf-8"%>

GET 请求出现乱码

当使用GET方法传递参数时,由于URL中的参数通常是用ISO-8859-1编码传输的,如果直接读取可能会遇到中文乱码问题。

治标的方法:new String(变量名.getBytes("iso-8859-1"), "utf-8" )

  • 将字符串先按照 ISO-8859-1 解码为字节数组,然后按照 UTF-8 重新编码成字符串。

治本的方法:通过配置Tomcat的server.xml文件,在<Connector>标签内添加或修改属性

  • URIEncoding="UTF-8"useBodyEncodingForURI="true" 正确地处理包含非英文字符的URL参数。

tomcat\conf\server.xml文件中找到相应的<Connector>元素,并确保它包含如下配置

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1"redirectPort="8443" URIEncoding="UTF-8" useBodyEncodingForURI="true"/>

一般只设置 URIEncoding=“UTF-8” 就ok

转发与重定向

转发(Forward)和重定向(Redirect)是两种常见的请求处理方式,它们都可以用来将用户从一个资源引导到另一个资源,但实现机制和应用场景有所不同。

转发

在服务器端进行的操作,当一个Servlet或JSP页面接收到请求后,它可以通过RequestDispatcher对象将请求转发给另一个资源(如另一个Servlet、JSP页面等),而客户端对此并不知情。转发过程中URL不会发生变化,对于用户来说就像是访问了一个单一的资源。

特点

  • 请求仍然在同一个HTTP请求内完成。
  • 服务器端控制整个过程,对客户端透明。
  • 可以共享请求作用域中的数据(通过HttpServletRequestsetAttribute方法设置的数据)。
  • 适合于内部资源间的跳转,比如从一个Servlet跳转到一个JSP页面显示结果。

常见方式

在Servlet中使用RequestDispatcherforward方法

// 获取RequestDispatcher
RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/targetPage.jsp");
// 转发请求
dispatcher.forward(request, response);

在JSP页面中使用<jsp:forward>动作标签

<jsp:forward page="/WEB-INF/jsp/targetPage.jsp">...
</jsp:forward>

转发的工作方式

在这里插入图片描述

重定向

重定向是一个两步的过程,首先服务器发送一个特殊的响应给浏览器,告诉浏览器去请求一个新的URL。浏览器会用这个新的URL发起一个新的请求。这意味着重定向会导致浏览器地址栏中的URL发生变化。

特点

  • 涉及两次独立的HTTP请求。
  • 客户端可见,因为浏览器地址栏中的URL会发生变化。
  • 不可以共享原始请求中的数据;如果需要传递信息,通常使用查询字符串或者Session。
  • 适用于跨域跳转、外部网站链接以及某些安全性考虑的情况,例如登录成功后的跳转。
response.sendRedirect("http://example.com/anotherPage.html");

重定向的工作方式

在这里插入图片描述

区别

转发是服务器行为,重定向是客户端行为。

// 转发
request.getRequestDispatcher("url").forward(request, response);
// 重定向
response.sendRedirect("url");
  • 转发可以携带参数,重定向不可以
  • 转发 url 不会发生变化,重定向会
  • 转发不会重新发送请求,重定向会
  • 转发只能跳转当前项目路径,重定向可以跳转任意 url

升级示例1

HTML 表单内容不变化

<form action="dologin.jsp" method="post">账号:<input type="text" name="uname"/><br/>密码:<input type="text" name="upwd"/><br/><input type="submit"/>
</form>

不再存储登录信息,改跳转方式转发为重定向,去到【doindex.jsp】

<%// 解决 post 中文乱码问题(必须放在接收参数之前)request.setCharacterEncoding("utf-8");// 接收参数String uname = request.getParameter("uname");String upwd = request.getParameter("upwd");// 调用 Java 方法 登录SmbmsUserDao smbmsUserDao = new SmbmsUserDaoImpl();SmbmsUser smbmsUser =  smbmsUserDao.login(uname,upwd);// 判断登录是否成功if (smbmsUser != null) {// setAttribute 存储登录信息// request.setAttribute("smbmsUserName",smbmsUser.getUserName());// 转发// request.getRequestDispatcher("index.jsp").forward(request,response);// 重定向response.sendRedirect("doindex.jsp");} else {// 登录失败则重定向回登录界面response.sendRedirect("login.jsp");}
%>

doindex.jsp 作为一个中间处理页面,主要负责调用业务逻辑(例如获取供应商列表信息)并将结果存储到请求作用域中,然后将请求转发给 index.jsp 进行视图展示。这种方式相比直接在 index.jsp 中执行业务逻辑,可以做到逻辑与视图分离,增强可读性和可维护性;提高复用性;增强安全性。

<%// 调用 Java 方法 获取供应商列表信息SmbmsProviderDao smbmsProviderDao = new SmbmsProviderDaoImpl();List<SmbmsProvider> providerList = smbmsProviderDao.findAll();// setAttribute 存储供应商信息request.setAttribute("providerList",providerList);// 转发request.getRequestDispatcher("index.jsp").forward(request,response);
%>

不再获取登录信息,处理业务逻辑的部分交由 doindex.jsp 实现。

<%// getAttribute 获取登录信息// String name =  request.getAttribute("smbmsUserName").toString();// getAttribute 获取供应商信息List<SmbmsProvider> smbmsProviderList = (List<SmbmsProvider>)request.getAttribute("providerList");
%>
<h1><%-- <%= name%> --%>欢迎您登录 供应商信管理系统!!!
</h1>
<table border="1"><tr><th>ID</th><th>proCode</th><th>proName</th><th>proDesc</th></tr><% for(SmbmsProvider smbmsProvider : smbmsProviderList){ %><tr><td><%= smbmsProvider.getId()%></td><td><%= smbmsProvider.getProCode()%></td><td><%= smbmsProvider.getProName()%></td><td><%= smbmsProvider.getProDesc()%></td></tr><% } %>
</table>
<%// session.getAttribute 获取登录信息SmbmsUser smbmsUser =  (SmbmsUser)session.getAttribute("smbmsUser");// getAttribute 获取供应商信息List<SmbmsProvider> smbmsProviderList =  (List<SmbmsProvider>)request.getAttribute("providerList");
%>
<h1><%=smbmsUser.getUserName()%>欢迎您登录 供应商信管理系统!!!
</h1>
<form action="logout.jsp" method="get"><input type="submit" value="安全退出"/>
</form>

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

ROS话题通信机制理论模型的学习

话题通信是ROS&#xff08;Robot Operating System&#xff0c;机器人操作系统&#xff09;中使用频率最高的一种通信模式&#xff0c;其实现模型主要基于发布/订阅模式。 一、基本概念 话题通信模型中涉及三个主要角色&#xff1a; ROS Master&#xff08;管理者&#xff0…

【Ai教程】Ollma安装 | 0代码本地运行Qwen大模型,保姆级教程来了!

我们平时使用的ChatGPT、kimi、豆包等Ai对话工具&#xff0c;其服务器都是部署在各家公司的机房里&#xff0c;如果我们有一些隐私数据发到对话中&#xff0c;很难保证信息是否安全等问题&#xff0c;如何在保证数据安全的情况下&#xff0c;又可以使用大预言模型&#xff0c;O…

从工作原理上解释为什么MPLS比传统IP方式高效?

多协议标签交换&#xff08;Multiprotocol Label Switching, MPLS&#xff09;是一种用于高速数据包转发的技术。它通过在网络的入口点对数据包进行标签操作&#xff0c;然后在核心网络内部基于这些标签来快速转发数据包&#xff0c;从而提高了数据传输效率。以下是几个方面解释…

以命令行形式执行Postman脚本(使用Newman)

一、背景 ​ Postman的操作离不开客户端。但是在一些情况下可能无法使用客户端去进行脚本执行。比如在服务端进行接口测试。由此我们引入了Newman。Newman基于Node.js开发&#xff0c;它使您可以直接从命令行轻松运行和测试Postman测试集。它在构建时考虑了可扩展性&#xff0c…

国内手机号Google账号(gmail)注册教程

注意&#xff01;&#xff01;本篇只适用于未注册过或未修改过的萌新用户&#xff01;&#xff01;&#xff01;&#xff01;&#xff08;我注册第二个账号时就通过不了了&#xff09; 国内手机号码如何创建Google&#xff08;谷歌&#xff09;账号&#xff0c;我们会发现&…

性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台

前言 在当前激烈的市场竞争中&#xff0c;创新和效率成为企业发展的核心要素之一。在这种背景下&#xff0c;如何保证产品和服务的稳定性、可靠性以及高效性就显得尤为重要。 而在软件开发过程中&#xff0c;性能测试是一项不可或缺的环节&#xff0c;它可以有效的评估一个系…

大语言模型训练的全过程:预训练、微调、RLHF

一、 大语言模型的训练过程 预训练阶段&#xff1a;PT&#xff08;Pre training&#xff09;。使用公开数据经过预训练得到预训练模型&#xff0c;预训练模型具备语言的初步理解&#xff1b;训练周期比较长&#xff1b;微调阶段1&#xff1a;SFT&#xff08;指令微调/有监督微调…

【LeetCode】【算法】142. 环形链表II

142环形链表II 题目描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#x…

白话文讲解大模型| Attention is all you need

本文档旨在详细阐述当前主流的大模型技术架构如Transformer架构。我们将从技术概述、架构介绍到具体模型实现等多个角度进行讲解。通过本文档&#xff0c;我们期望为读者提供一个全面的理解&#xff0c;帮助大家掌握大模型的工作原理&#xff0c;增强与客户沟通的技术基础。本文…

解析IO零拷贝技术

背景介绍 从字面上我们很容易理解出&#xff0c;零拷贝包含两个意思&#xff1a; 拷贝&#xff1a;就是指数据从一个存储区域转移到另一个存储区域。零&#xff1a;它表示拷贝数据的次数为 0。 合起来理解&#xff0c;零拷贝就是不需要将数据从一个存储区域复制到另一个存储…

练习LabVIEW第三十六题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第三十六题&#xff1a; 使用labview模拟温度采集系统&#xff0c;要求有停止键 开始编写&#xff1a; 前面板放一个温度…

day-81 打家劫舍 II

思路 与LCR 089. 打家劫舍相比&#xff0c;本题所有房屋围成了一圈&#xff0c;那么第一间房子和最后一间房子不能同时打劫&#xff0c;那么就可以分为两种情况&#xff1a;1.选第一间房打劫&#xff1b;2.选最后一间房打劫 解题过程 然后依次计算出以上两种情况的最大金额&am…

linux网络编程自定义协议和多进程多线程并发-TCP编程

1.三次握手及后面过程 计算机A是客户端, B是服务端 1.1三次握手&#xff1a; 1客户端给服务端SYN报文 2服务端返回SYNACK报文 3客户端返回ACK报文 客户端发完ACK后加入到服务端的维护队列中&#xff0c;accept()调用后就能和客户端建立连接&#xff0c;然后建立通讯 1.2关闭…

【工具】批量网址打开器,一次打开多个网址链接

假如你有很多个网址&#xff0c;这些网址要全部打开&#xff0c;你是否会每次复制一个粘贴到浏览器地址栏&#xff0c;再去复制下一个粘贴到地址栏&#xff0c;这样重复的操作&#xff1f;我就有这样的困扰&#xff0c;比如要检查网页上是否有bug&#xff0c;就要一个一个的点开…

「Mac畅玩鸿蒙与硬件24」UI互动应用篇1 - 灯光控制小项目

本篇将带领你实现一个互动性十足的灯光控制小项目&#xff0c;用户可以通过点击按钮来控制灯光的开关。该项目将涉及状态管理、动态图片加载以及按钮交互&#xff0c;是学习鸿蒙应用开发的重要基础。 关键词 UI互动应用状态管理动态图片加载用户交互 一、功能说明 在这个灯光…

如何从0到1开发一款智能生产小工单系统——全网最详细教程!

在生产车间&#xff0c;工单管理一度是个让人头疼的问题。任务分配不清、生产流程混乱、交接环节不顺畅等问题&#xff0c;让管理人员和一线工人疲于奔命。而一个智能的生产小工单系统正是解决这些问题的利器。不仅能有效地理顺工单流转流程&#xff0c;还能大幅提升工作效率和…

SpringBoot基础系列学习(五):JdbcTemplate 访问数据库

文章目录 一丶介绍二丶引入依赖三丶配置配置文件四丶创建表五丶java代码 一丶介绍 Spring Boot作为Spring的集大成者&#xff0c;自然会将JdbcTemplate集成进去。Spring Boot针对JDBC的使用提供了对应的Starter包&#xff1a;spring-boot-starter-jdbc&#xff0c;它其实就是在…

win11电脑无法找到声音输出设备怎么办?查看解决方法

电脑无法找到声音输出设备是一个常见的问题&#xff0c;尤其是在使用Windows操作系统时。幸运的是&#xff0c;大部分问题都可以通过以下几种方法来解决。 一、检查物理连接 在深入诊断之前&#xff0c;首先要检查硬件连接是否正常。这包括&#xff1a; 确保耳机、扬声器或其…

二叉树相关习题

题目&#xff1a;100. 相同的树 - 力扣&#xff08;LeetCode&#xff09; 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; …

数据结构和算法(六):贪心算法、分治算法、回溯算法、动态规划、拓扑排序

从广义上来讲&#xff1a;数据结构就是一组数据的存储结构 &#xff0c; 算法就是操作数据的方法 数据结构是为算法服务的&#xff0c;算法是要作用在特定的数据结构上的。 10个最常用的数据结构&#xff1a;数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie树 10个最…