response.sendRedirect 传递参数可能出现的问题(乱码、地址映射出错)

本文详细解析了HTTP响应重定向的过程,包括如何在不同页面间传递数据、解决参数过长与中文乱码问题,以及重定向与转发的区别。重点讨论了在页面跳转时使用request和response对象的方法,提供了避免乱码与有效传递大数据的解决方案。

response.sendRedirect是通过浏览器来做转向的。

假设在A页面设置 request.setAttribute("username","admin");

那么在  request.sendredirect 转向的B页面中是不能通过request.getAttribute("username");  来得到  admin的。

这是因为上个页面请求已经结束,也就是 request这个对象已经消亡了。所以也就得不到admin了。

可以使用request.getDispatcherHeader(next.jsp").forward(request,response);在next.jsp页面就可以得到admin了。

此外要说明:如果你的jsp页面是在webroot目录下,那么在response.sendRedirect(参数);参数中的路径是不同的。

response.sendRedirect(参数);应该是:response.sendRedirect(request.getContextPath() + "/next.jsp");

而在request.getDispatcherHeader(参数).forward(request,response);应该使用request.getDispatcherHeader("next.jsp").forward(request,response);


response.sendrerirect(url)参数乱码问题



1、参数过长

response.sendRedirect(url)是get传输,url长度最大限制在2k,如果url的参数是动态增长的,

所以建议不使用此方法进行跳转,用forward进行跳转,使用setAttribute传递大数据。

request.setAttribute(“aa”,"大数据");
request.getRequestDispatcher(url).forward(request,response);


2、中文乱码

如果response.sendRedirect(url)中所传递的是固定长度的url,并且长度小于限制的范围内,

在使用中文参数的时候出现乱码,可使用以下方法进行转码。
 

String message = "中文";
message = URLEncoder.encode(message,"GBK");
response.sendRedirect(url+"?message ="+message );
 

jsp或Servlet都会用到页面跳转,可以用
request.getRequestDispatcher("p3.jsp").forward(request,response);这种方法称为转发,地址栏上的URL不会改变;
response.sendRedirect("p3.jsp");这种方法称为重定向,地址栏的URL会改变;
这样实现跳转到p3.jsp;可是这两种方法有着本质的不同,requset是请求,是在服务器端运行的,response是相应,是在客户端运行的;

<think>好的,我现在需要为用户提供一个符合要求的login.jsp代码示例。用户提到的技术栈包括JSP、EL表达式、JSTL标签、MVC框架、JavaBean、JDBC、MySQL、Servlet 3.0等。首先,我得回忆一下这些技术在登录功能中的典型应用。 首先,MVC架构中,JSP作为视图层,主要负责显示,而Servlet作为控制器处理请求,JavaBean作为模型层处理业务逻辑和数据。用户登录的基本流程应该是:用户在JSP页面输入用户名和密码,表单提交到Servlet,Servlet获取参数后调用JavaBean进行数据库验证,然后根据结果跳转到成功或失败页面。 接下来,用户要求使用EL表达式和JSTL标签。在JSP中,这意味着要避免使用Java代码片段,而是用JSTL标签如<c:if>来处理条件显示,比如显示错误信息。EL表达式则用于从请求作用域中获取数据,比如${errorMsg}。 然后考虑表单验证。前端可能需要一些基本的JavaScript验证,比如非空检查,但后端Servlet也必须进行验证,防止绕过前端提交。如果用户名或密码为空,Servlet应该将错误信息放入请求作用域并转发回login.jsp显示。 数据库方面,使用JDBC连接MySQL,通常会在JavaBean或专门的DAO类中处理。这里可能需要一个User类作为JavaBean,包含用户名和密码属性,并有对应的getter和setter方法。Service层会调用DAO层的方法,通过JDBC查询数据库验证用户是否存在。 在Servlet 3.0中,可以使用注解配置,而不用web.xml。例如,@WebServlet("/login")来映射URL。处理POST请求时,获取参数,调用服务层,根据返回结果决定转发或重定向路径。 关于安全性,密码不应该明文存储,所以数据库中的密码应该是哈希加盐后的结果。但示例代码可能简化处理,只是验证明文,但实际应用中必须加密。 现在考虑JSP的具体代码结构。需要使用JSTL的核心标签库,所以开头要引入<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>。表单的action指向Servlet的URL,比如login。表单字段用name属性对应Servlet获取的参数名。 错误信息显示部分,使用<c:if test="${not empty errorMsg}">来检查是否存在错误消息,并用EL显示${errorMsg}。可能还需要处理来自其他页面的注销消息,比如登出后的提示。 样式方面,用户没有特别要求,但为了页面友好,可以加入简单的CSS,比如居中、表单样式、错误信息颜色等,这部分可以内联在JSP中,或者链接外部CSS文件,但示例可能内联更简单。 然后,需要考虑代码的健壮性。比如,表单提交后,如果验证失败,保留用户输入的用户名,方便重新填写。可以通过EL表达式在input的value属性中设置value="${param.username}",这样在提交后回显用户名。 最后,确保示例代码符合技术栈要求,没有遗漏任何部分,比如JSTL的正确使用,Servlet的注解配置,JavaBean的结构,以及JDBC的正确调用。同时,代码应该简洁,突出主要功能,避免不必要的复杂性。 可能还需要处理中文乱码问题,在Servlet中设置request和response的编码为UTF-8,以及数据库连接的字符集设置。例如,在Servlet的doPost方法开始处调用request.setCharacterEncoding("UTF-8")response.setContentType("text/html;charset=UTF-8")。 总结下来,login.jsp需要包含表单、错误显示、JSTL和EL的使用,提交到Servlet,Servlet处理验证,使用JavaBean和JDBC访问数据库,返回结果。代码结构清晰,符合MVC分层,各技术组件正确应用。</think>以下是一个基于MVC架构的新闻管理系统登录页面实现方案: ```jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <title>新闻管理系统 - 用户登录</title> <style> .container {width: 400px; margin: 100px auto;} .error {color: red; margin-bottom: 10px;} </style> </head> <body> <div class="container"> <h2>用户登录</h2> <%-- 显示错误信息 --%> <c:if test="${not empty errorMsg}"> <div class="error">${errorMsg}</div> </c:if> <form action="login" method="post"> <div> <label>用户名:</label> <input type="text" name="username" value="${param.username}" required> </div> <div> <label>密码:</label> <input type="password" name="password" required> </div> <button type="submit">登录</button> </form> </div> </body> </html> ``` 配套的Servlet实现(LoginServlet.java): ```java @WebServlet("/login") public class LoginServlet extends HttpServlet { private UserService userService = new UserService(); protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); String username = request.getParameter("username"); String password = request.getParameter("password"); // 基础验证 if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) { request.setAttribute("errorMsg", "用户名和密码不能为空"); request.getRequestDispatcher("/login.jsp").forward(request, response); return; } try { User user = userService.login(username, password); if (user != null) { request.getSession().setAttribute("currentUser", user); response.sendRedirect("newsList"); } else { request.setAttribute("errorMsg", "用户名或密码错误"); request.getRequestDispatcher("/login.jsp").forward(request, response); } } catch (SQLException e) { request.setAttribute("errorMsg", "系统错误,请稍后再试"); request.getRequestDispatcher("/login.jsp").forward(request, response); } } } ``` 代码说明: 1. **视图层**:使用JSP+JSTL+EL组合 - 通过`<c:if>`标签控制错误信息显示 - 使用EL表达式`${param.username}`保持表单数据 - 使用HTML5表单验证[^2] 2. **控制层**:Servlet处理业务逻辑 - 使用`@WebServlet`注解配置Servlet 3.0[^4] - 实现MVC转发控制逻辑 - 处理会话管理(Session) 3. **模型层**:建议创建以下JavaBean ```java public class User { private Integer id; private String username; private String password; // 其他属性及getter/setter } ``` 4. **数据库连接**推荐配置: ```properties # jdbc.properties jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/news_db?useSSL=false&serverTimezone=UTC jdbc.username=root jdbc.password=123456 ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值