JSP中实现页面跳转的三种方法以及区别(转载)

本文介绍了JSP中实现页面跳转的三种方法:forward、sendRedirect及使用header进行重定向,并详细阐述了它们之间的区别,包括跳转类型、地址栏变化、request属性保留等关键特性。

JSP中实现页面跳转的三种方法以及区别

通过重定向可以实现跳转,跳转后页面地址变为跳转后的地址。

我们已经知道有两种跳转方法了

Java代码
  1. 第一种是:<jsp:forward page=””/>;   
  2.   
  3. 第二种是:response.sendRedirect(“地址”);  
  4.   
  5. 第三种:response.setHeader("refresh" , "2;URL=responseDemo02.jsp" ) ;  
  6.   
  7. //2秒后自动跳转到responseDemo02.jsp页面,也是一种重定向方法   
Java代码 复制代码
  1. 第一种是:<jsp:forward page=””/>;    
  2.   
  3. 第二种是:response.sendRedirect(“地址”);   
  4.   
  5. 第三种:response.setHeader("refresh","2;URL=responseDemo02.jsp") ;   
  6.   
  7. //2秒后自动跳转到responseDemo02.jsp页面,也是一种重定向方法  
第一种是:<jsp:forward page=””/>; 

第二种是:response.sendRedirect(“地址”);

第三种:response.setHeader("refresh","2;URL=responseDemo02.jsp") ;

//2秒后自动跳转到responseDemo02.jsp页面,也是一种重定向方法



【response.setHeader("refresh","1");表示页面1秒后将自动刷新】


这两种跳转有什么区别呢?【面试的时候经常遇到】

<jsp:forward page=””/>
-跳转后地址不变。这种跳转称为服务器端跳转。

跳转语句之后的语句不会得到执行。

能保留request属性。

通过<jsp:param name=”” value=””/>传递参数


response.sendRedirect(“地址”):

跳转后地址改变。这种跳转称为客户端跳转。

跳转语句前后代码都执行完毕之后再跳转。

不能保留request属性,地址改变了,客户端跳转。

通过客户端跳转可以使用重写URL的方式把参数传递过去。

import com.zyy.pojo.User; import java.sql.Connection; import java.sql.SQLException; /** * @ClassName: UserDao * @Description: TODO 类描述 * @Author: zyy * @Date: 2022/01/09 10:38 * @Version: 1.0 */ public interface UserDao { /** * 根据用户编码获取用户信息 * @param con * @param userCode * @return */ User getLoginUser(Connection con, String userCode) throws SQLException; } 一键获取完整项目代码 java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 编写dao接口的实现类 import com.zyy.dao.BaseDao; import com.zyy.dao.user.UserDao; import com.zyy.pojo.User; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * @ClassName: UserDaoImpl * @Description: TODO 类描述 * @Author: zyy * @Date: 2022/01/09 10:51 * @Version: 1.0 */ public class UserDaoImpl implements UserDao { public User getLoginUser(Connection con, String userCode) throws SQLException { PreparedStatement ps = null; ResultSet rs = null; User user = null; if (con != null) { String sql = "select id, userCode, userName, userPassword, gender, birthday, phone, address, userRole, createdBy, creationDate, modifyBy, modifyDate from smbms_user where userCode=?"; Object[] params = {userCode}; rs = BaseDao.execute(con, ps, rs, sql, params); if (rs.next()) { user = new User(); user.setId(rs.getInt("id")); user.setUserCode(rs.getString("userCode")); user.setUserName(rs.getString("userName")); user.setUserPassword(rs.getString("userPassword")); user.setGender(rs.getInt("gender")); user.setBirthday(rs.getDate("birthday")); user.setPhone(rs.getString("phone")); user.setAddress(rs.getString("address")); user.setUserRole(rs.getInt("userRole")); user.setCreatedBy(rs.getInt("createdBy")); user.setModifyBy(rs.getInt("modifyBy")); user.setCreationDate(rs.getTimestamp("creationDate")); user.setModifyDate(rs.getTimestamp("modifyDate")); } //关闭 BaseDao.closeResource(ps, rs); } return user; } } 一键获取完整项目代码 java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 业务层接口 import com.zyy.pojo.User; /** * @InterfaceName: UserService * @Description: TODO 接口描述 * @Author: zyy * @Date: 2022/01/09 11:18 * @Version: 1.0 */ public interface UserService { /** * 登录 * @param userCode * @param password * @return */ User login(String userCode, String password); } 一键获取完整项目代码 java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 业务层实现类 import com.zyy.dao.BaseDao; import com.zyy.dao.user.UserDao; import com.zyy.dao.user.impl.UserDaoImpl; import com.zyy.pojo.User; import com.zyy.service.user.UserService; import java.sql.Connection; import java.sql.SQLException; /** * @ClassName: UserServiceImpl * @Description: TODO 类描述 * @Author: zyy * @Date: 2022/01/09 11:20 * @Version: 1.0 */ public class UserServiceImpl implements UserService { /** * 业务层会调用dao层,所以这里引入Dao层 */ private UserDao userDao; public UserServiceImpl() { userDao = new UserDaoImpl(); } public User login(String userCode, String password) { Connection con = null; User user = null; try { con = BaseDao.getConnection(); user = userDao.getLoginUser(con, userCode); } catch (SQLException e) { e.printStackTrace(); } finally { BaseDao.closeResource(con); } return user; } } 一键获取完整项目代码 java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 编写servlet import com.zyy.pojo.User; import com.zyy.service.user.UserService; import com.zyy.service.user.impl.UserServiceImpl; import com.zyy.util.Constants; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * @ClassName: LoginServlet * @Description: TODO 类描述 * @Author: zyy * @Date: 2022/01/09 11:36 * @Version: 1.0 */ public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("LoginServlet---start----"); //用户前端输入的用户名和密码 String userCode = req.getParameter("userCode"); String userPassword = req.getParameter("userPassword"); //调用业务层 UserService userService = new UserServiceImpl(); User user = userService.login(userCode, userPassword); if (user != null) { //查有此人 //将用户的信息放到session中 req.getSession().setAttribute(Constants.USER_SESSION, user); //跳转到主页 resp.sendRedirect("jsp/frame.jsp"); } else { //查无此人 //转发回登录页面,并提示它用户名或者密码错误 req.setAttribute("error", "用户名或者密码错误"); req.getRequestDispatcher("login.jsp").forward(req, resp); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } } ———————————————— 版权声明:本文为优快云博主「程序猿tu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.youkuaiyun.com/qq_41171409/article/details/123553501没有验证密码为什么可以实现登录
最新发布
12-15
在分析未验证密码却能实现登录功能的原因时,需要查看各个类的具体实现。以下是对可能涉及的类进行分析: ### UserDao 接口 通常该接口会定义与数据库交互的方法,如根据用户信息查询用户。若未验证密码,可能是接口方法设计只关注了用户标识(如用户名),而未对密码进行查询验证。 ```java public interface UserDao { // 可能只根据用户名查询用户 User findUserByUsername(String username); } ``` ### UserDaoImpl 实现实现 UserDao 接口,负责具体的数据库操作。若未验证密码,可能是 SQL 查询语句只查询了用户名相关信息,而未对密码进行比对。 ```java public class UserDaoImpl implements UserDao { @Override public User findUserByUsername(String username) { // 示例 SQL 只查询用户名,未涉及密码 String sql = "SELECT * FROM users WHERE username = ?"; // 执行查询操作 // ... } } ``` ### UserService 接口 定义业务逻辑方法,如登录方法。若未验证密码,可能是接口设计只接收了部分用户信息(如只有用户名)。 ```java public interface UserService { // 可能只接收用户名进行登录 User login(String username); } ``` ### UserServiceImpl 实现实现 UserService 接口,调用 UserDao 进行业务逻辑处理。若未验证密码,可能是在调用 UserDao 方法时,未传递密码信息。 ```java public class UserServiceImpl implements UserService { private UserDao userDao = new UserDaoImpl(); @Override public User login(String username) { // 只传递用户名,未传递密码 return userDao.findUserByUsername(username); } } ``` ### LoginServlet 类 处理登录请求,调用 UserService 进行登录验证。若未验证密码,可能是在获取请求参数时,只获取了用户名,未获取密码,或者在调用 UserService 方法时,未传递密码信息。 ```java @WebServlet("/login") public class LoginServlet extends HttpServlet { private UserService userService = new UserServiceImpl(); @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 只获取用户名,未获取密码 String username = request.getParameter("username"); User user = userService.login(username); if (user != null) { // 登录成功处理 } else { // 登录失败处理 } } } ``` ### 未验证密码却能实现登录功能的原因总结 1. **接口设计问题**:UserDao 和 UserService 接口设计时,方法参数只考虑了用户名,未包含密码,导致后续实现类无法对密码进行验证。 2. **数据库查询问题**:UserDaoImpl 中的 SQL 查询语句只查询了用户名相关信息,未对密码进行比对。 3. **业务逻辑问题**:UserServiceImpl 在调用 UserDao 方法时,未传递密码信息,使得密码验证环节缺失。 4. **Servlet 处理问题**:LoginServlet 在获取请求参数和调用 UserService 方法时,只处理了用户名,未处理密码。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值