Java网络开发(servlet思考)——什么时候用转发,什么时候用重定向 & 请求request,响应response_什么时候用到重定向

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ResData {
// 返回码,200正常,10001参数错误。。。
private Integer code;
// 正常标识,success,ok
private String msg;
// 具体的信息,可以是对象
private Object data;
}


#### 2.在axios中,所有响应必须是 resp.getWriter().write() 的方式,核心代码如下



resp.getWriter().write(JSON.toJSONString(new ResData(1001, “输入为空”, null)));


### 同步请求情况下—根据需求选response/request


TODO:什么时候跳转到jsp,什么时候重定向,什么时候转发


思考:和需求相关,如果这里直接到一个不需要servlet处理的页面,则用重定向即可



如果需要处理一下,再到页面,则用转发给另一个servlet继续进行业务处理
跳转到新闻信息页面—开始为了测试跳转是否实现,用了重定向;
最终,业务是登陆成功后,查询数据库,进行显示,则转发给ListServlet进行处理,


#### 1.登陆后重定向


在一开始写代码的时候,在login.jsp中进行输入用户名和密码,进行登陆,然后在LoginServlet.java中对前端传进来的用户名和密码进行验证,即处理登陆业务;如果验证成功,则跳转到新闻展示页面。由于一开始代码并不完善,因此:


在这里先让登陆成功后,直接跳转到 list.jsp 前端页面,在页面上只有一个<h1标签。此时,我的目的是,用跳转成功来验证登陆的业务代码是否正确,因此,用了重定向;



resp.sendRedirect(req.getContextPath()+“/news/list.jsp”);


login.jsp中的代码:



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

用户登陆

杂七杂八新闻管理系统登陆页面

用户名:
密码:

![在这里插入图片描述](https://img-blog.csdnimg.cn/a9b9732a155f454faabd4368e55f9012.png)


LoginServlet.java代码:



/**
* 处理登陆的servlet
*/
@WebServlet(“/user/login”)
public class LoginServlet extends HttpServlet {
private IUserService userService = new UserServiceImpl();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter(“username”);
String password = req.getParameter(“password”);
System.out.println(username+password);

    if (StringUtils.isBlank(username) || StringUtils.isBlank(password)){
        // TODO:给前端
        System.out.println("输入空");
        return;
    }

    User userDb = userService.queryByUsername(username);

    if (userDb==null || !password.equals(userDb.getPassword())){
        System.out.println("用户名|密码错误");
        return;
    }

    // 登陆成功的信息保存到session中
    HttpSession session = req.getSession();
    session.setAttribute("user", userDb);

    // TODO:什么时候跳转到jsp,什么时候重定向,什么时候转发
    // 思考:和需求相关,如果这里直接到一个不需要servlet处理的页面,则用重定向即可
    // 如果需要处理一下,再到页面,则用转发给另一个servlet继续进行业务处理
    // 跳转到新闻信息页面---开始为了测试跳转是否实现,用了重定向
    resp.sendRedirect(req.getContextPath()+"/news/list.jsp");
}

}


此时展示新闻的 list.jsp页面代码如下:就是简单在前端显示一个标签



<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>

新闻浏览页面

新闻浏览页面


![在这里插入图片描述](https://img-blog.csdnimg.cn/a0007a4bee484ed89e5aae075ad4b44b.png)


#### 2.登陆后转发


实际上,新闻的页面需要先查询一下数据库,获取数据库中的新闻后,再发送到 list.jsp 页面进行显示,此时,就用请求的转发,从LoginServlet.java的  
 @WebServlet(“/user/login”) 转发到 ListServlet.java 的@WebServlet(“/news/list”),在这个servlet里面进行新闻的查询,然后把查询到的新闻共享到 list.jsp 页面进行展示。


此时LoginServlet.java用请求转发:



req.getRequestDispatcher(“/news/list”).forward(req, resp);


进行数据库查询的ListServlet.java代码如下:



/**
* 文章列表显示的servlet
*/

@WebServlet(“/news/list”)
public class ListServlet extends HttpServlet {
private IArticleService articleService = new ArticleServiceImpl();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1.获取前端的输入:第几页,每页数据量,查询关键词是啥
String pageNumStr = req.getParameter(“pageNum”); // 第几页
String pageSizeStr = req.getParameter(“pageSize”); // 每页显示数据条数
String keyword = req.getParameter(“name”);

    // 2.进行赋值,默认首页,默认每页3条
    Integer pageNum = StringUtils.isBlank(pageNumStr) ? 1:Integer.parseInt(pageNumStr);
    Integer pageSize = StringUtils.isBlank(pageSizeStr) ? 3:Integer.parseInt(pageSizeStr);

    // 3.计算数据总条数
    Integer total = articleService.countLikeLines(keyword);

    // 4.计算总页数
    Integer pages = total % pageSize==0 ? total/pageSize:total/pageSize+1;

    // 5.new pageInfo对象
    List<Article> list = articleService.queryByKeyWordDescLimit(keyword, pageNum, pageSize);
    PageInfo<Article> pageInfo = new PageInfo<>(pageNum,pageSize,total, pages, list);

    System.out.println(list);

    // 6.共享值
    req.setAttribute("pageInfo", pageInfo);
    req.setAttribute("name", keyword);
    System.out.println(pageInfo);

    // 6.转发给前端显示
    req.getRequestDispatcher("/news/list.jsp").forward(req, resp);

}

}


转发到list.jsp进行前端展示,代码如下:



<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>

新闻浏览页面

新闻浏览页面

${pageInfo}

<%– p a r a m < b r > − − < {param}<br>--%> <%-- param<br><{sessionScope}–%>
<%-- 输入查询的条件–%>

<%-- 隐藏框--%> 查询:
每页显示条数:

发布文章

<c:forEach items="${pageInfo.list}" var="ar">
    <tr>
        <td>${ar.articleId}</td>
        <td>${ar.channelName}</td>
        <td>${ar.articleTitle}</td>
        <td>${ar.articleContent}</td>
        <td>
            <a href="/day06/news/delete?id=${ar.articleId}">删除</a>
            <a href="/day06/update/page?id=${ar.articleId}">修改</a>
        </td>

    </tr>

</c:forEach>
编号栏目标题内容操作


<c:if test=“KaTeX parse error: Expected 'EOF', got '&' at position 64: …/list?pageNum=1&̲pageSize={pageInfo.pageSize}&name= n a m e " > 首页 < / a > < a h r e f = " / d a y 06 / n e w s / l i s t ? p a g e N u m = {name}">首页</a> <a href="/day06/news/list?pageNum= name">首页</a><ahref="/day06/news/list?pageNum={pageInfo.pageNum-1}&pageSize=KaTeX parse error: Expected 'EOF', got '&' at position 20: …eInfo.pageSize}&̲name={name}”>上一页
</c:if>

<%-- 如果当前页是尾页,需要控制下一页和尾页不显示 --%>
<c:if test=“ p a g e I n f o . p a g e N u m ! = p a g e I n f o . p a g e s " > < a h r e f = " / d a y 06 / n e w s / l i s t ? p a g e N u m = {pageInfo.pageNum!=pageInfo.pages}"> <a href="/day06/news/list?pageNum= pageInfo.pageNum!=pageInfo.pages"><ahref="/day06/news/list?pageNum={pageInfo.pageNum+1}&pageSize=KaTeX parse error: Expected 'EOF', got '&' at position 20: …eInfo.pageSize}&̲name={name}”>下一页
尾页
</c:if>

总计 p a g e I n f o . p a g e s 页 / 当前 {pageInfo.pages}页/当前 pageInfo.pages/当前{pageInfo.pageNum}

跳转到:

![在这里插入图片描述](https://img-blog.csdnimg.cn/57d8882dc65043a9a6d79d5e9c95c7b4.png)


#### 3.总结


总结,个人认为有以下两点:  
 (1)如果处理的业务需要进行值的共享,那肯定是要用request的转发;  
 (2)如果并不涉及到值的共享,并且下一个业务和当前的业务相对独立,则可以用response的重定向;  
 (3)总归是看自己业务的需求,因为猫走不走直线完全取决于耗子;


## 案例:图书信息管理系统–同步请求


以一个图书信息的管理系统为例  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/da11308c29f74a419339797883293c91.png)


### 1.用户相关操作—注册,登陆,修改密码 / 昵称,退出登陆


(1)注册成功后重定向到 login.jsp 页面;  
 (2)登陆成功后重定向到 index.jsp 页面;  
 (3)修改密码后重定向到 login.jsp 页面;  
 (4)修改昵称后重定向到 index.jsp 页面;  
 (5)退出登陆后重定向到 login.jsp 页面;




| 序号 | 业务 | 选择 | 目标 |
| --- | --- | --- | --- |
| 1 | 注册成功 | 重定向 | login.jsp 页面 |
| 2 | 登陆成功 | 重定向 | index.jsp页面 |
| 3 | 修改密码 | 重定向 | login.jsp 页面 |
| 4 | 修改昵称 | 重定向 | index.jsp页面 |
| 5 | 退出登陆 | 重定向 | login.jsp 页面 |


### 2.图书相关操作—图书的 增删改查 和 统计


(0)查询图书list,  
 点击图书信息,由ListServlet.java进行数据库查询,查询到的图书信息,共享值并转发到 list.jsp 页面进行展示;


(1)增加一本图书  
 由AddPageServlet.java 处理, 获取 类型信息, 共享值并转发到 addPage.jsp 进行展示 ,用户填写后表单提交到 AddServlet.java 进行业务处理,新增成功后,重定向 到ListServlet.java进行数据库查询,查询到的图书信息,共享值并转发到 list.jsp 页面进行展示;


(2)修改一本图书  
 和上面流程类似,不同的是还要把原来的值 回传到updatePage.jsp 进行展示;


(3)删除一本书  
 点击删除按钮,删除成功后, 重定向 到ListServlet.java进行数据库查询,查询到的图书信息,共享值并转发到 list.jsp 页面进行展示;


(4)统计相关  
 由CountOpusServlet.java进行处理,得到统计信息,共享值到 count.jsp 页面,进行展示;





![img](https://img-blog.csdnimg.cn/img_convert/65e5abe2b687e92882485486feddc3f9.png)
![img](https://img-blog.csdnimg.cn/img_convert/318419a4dcf597a787eb957c7609c1a7.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618631832)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

计相关  
 由CountOpusServlet.java进行处理,得到统计信息,共享值到 count.jsp 页面,进行展示;





[外链图片转存中...(img-Opk6XHHU-1715791070468)]
[外链图片转存中...(img-3iiz6qwk-1715791070468)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618631832)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 27
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值