JavaWeb核心技术之Response(1)

resposne.sendRedirect(“/request-demo/resp2”);

}

@Override

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

this.doGet(request, response);

}

}

  1. 重定向的特点
  • 浏览器地址栏路径发送变化

当进行重定向访问的时候,由于是由浏览器发送的两次请求,所以地址会发生变化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RPKviNlC-1642599750802)(assets/1628861893130.png)]

  • 可以重定向到任何位置的资源(服务内容、外部均可)

因为第一次响应结果中包含了浏览器下次要跳转的路径,所以这个路径是可以任意位置资源。

  • 两次请求,不能在多个资源使用request共享数据

因为浏览器发送了两次请求,是两个不同的request对象,就无法通过request对象进行共享数据

介绍完请求重定向和请求转发以后,接下来需要把这两个放在一块对比下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NKlsqbj3-1642599750803)(assets/1628862170296.png)]

以后到底用哪个,还是需要根据具体的业务来决定。

3.3 路径问题

  1. 问题1:转发的时候路径上没有加/request-demo而重定向加了,那么到底什么时候需要加,什么时候不需要加呢?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ynJUH76e-1642599750803)(assets/1628862652700.png)]

其实判断的依据很简单,只需要记住下面的规则即可:

  • 浏览器使用:需要加虚拟目录(项目访问路径)

  • 服务端使用:不需要加虚拟目录

对于转发来说,因为是在服务端进行的,所以不需要加虚拟目录

对于重定向来说,路径最终是由浏览器来发送请求,就需要添加虚拟目录。

掌握了这个规则,接下来就通过一些练习来强化下知识的学习:

  • <a href='路劲'>

  • <form action='路径'>

  • req.getRequestDispatcher(“路径”)

  • resp.sendRedirect(“路径”)

答案:

1.超链接,从浏览器发送,需要加

2.表单,从浏览器发送,需要加

3.转发,是从服务器内部跳转,不需要加

4.重定向,是由浏览器进行跳转,需要加。

  1. 问题2:在重定向的代码中,/request-demo是固定编码的,如果后期通过Tomcat插件配置了项目的访问路径,那么所有需要重定向的地方都需要重新修改,该如何优化?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FDjkrbyf-1642599750803)(assets/1628863270545.png)]

答案也比较简单,我们可以在代码中动态去获取项目访问的虚拟目录,具体如何获取,我们可以借助前面咱们所学习的request对象中的getContextPath()方法,修改后的代码如下:

@WebServlet(“/resp1”)

public class ResponseDemo1 extends HttpServlet {

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

System.out.println(“resp1…”);

//简化方式完成重定向

//动态获取虚拟目录

String contextPath = request.getContextPath();

response.sendRedirect(contextPath+“/resp2”);

}

@Override

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

this.doGet(request, response);

}

}

重新启动访问测试,功能依然能够实现,此时就可以动态获取项目访问的虚拟路径,从而降低代码的耦合度。

3.4 Response响应字符数据

要想将字符数据写回到浏览器,我们需要两个步骤:

  • 通过Response对象获取字符输出流: PrintWriter writer = resp.getWriter();

  • 通过字符输出流写数据: writer.write(“aaa”);

接下来,我们实现通过些案例把响应字符数据给实际应用下:

  1. 返回一个简单的字符串aaa

/**

  • 响应字符数据:设置字符数据的响应体

*/

@WebServlet(“/resp3”)

public class ResponseDemo3 extends HttpServlet {

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.setContentType(“text/html;charset=utf-8”);

//1. 获取字符输出流

PrintWriter writer = response.getWriter();

writer.write(“aaa”);

}

@Override

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

this.doGet(request, response);

}

}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xj8GhwVb-1642599750804)(assets/1628863905362.png)]

  1. 返回一串html字符串,并且能被浏览器解析

PrintWriter writer = response.getWriter();

//content-type,告诉浏览器返回的数据类型是HTML类型数据,这样浏览器才会解析HTML标签

response.setHeader(“content-type”,“text/html”);

writer.write(“

aaa

”);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7HMFvyCb-1642599750804)(assets/1628864140820.png)]

==注意:==一次请求响应结束后,response对象就会被销毁掉,所以不要手动关闭流。

  1. 返回一个中文的字符串你好,需要注意设置响应数据的编码为utf-8

//设置响应的数据格式及数据的编码

response.setContentType(“text/html;charset=utf-8”);

writer.write(“你好”);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MPyANMtA-1642599750804)(assets/1628864390263.png)]

3.3 Response响应字节数据

要想将字节数据写回到浏览器,我们需要两个步骤:

  • 通过Response对象获取字节输出流:ServletOutputStream outputStream = resp.getOutputStream();

  • 通过字节输出流写数据: outputStream.write(字节数据);

接下来,我们实现通过些案例把响应字符数据给实际应用下:

  1. 返回一个图片文件到浏览器

/**

  • 响应字节数据:设置字节数据的响应体

*/

@WebServlet(“/resp4”)

public class ResponseDemo4 extends HttpServlet {

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//1. 读取文件

FileInputStream fis = new FileInputStream(“d://a.jpg”);

//2. 获取response字节输出流

ServletOutputStream os = response.getOutputStream();

//3. 完成流的copy

byte[] buff = new byte[1024];

int len = 0;

while ((len = fis.read(buff))!= -1){

os.write(buff,0,len);

}

fis.close();

}

@Override

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

this.doGet(request, response);

}

}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mobQvULz-1642599750805)(assets/1628864883564.png)]

上述代码中,对于流的copy的代码还是比较复杂的,所以我们可以使用别人提供好的方法来简化代码的开发,具体的步骤是:

(1)pom.xml添加依赖

commons-io

commons-io

2.6

(2)调用工具类方法

//fis:输入流

//os:输出流

IOUtils.copy(fis,os);

优化后的代码:

/**

  • 响应字节数据:设置字节数据的响应体

*/

@WebServlet(“/resp4”)

public class ResponseDemo4 extends HttpServlet {

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//1. 读取文件

FileInputStream fis = new FileInputStream(“d://a.jpg”);

//2. 获取response字节输出流

ServletOutputStream os = response.getOutputStream();

//3. 完成流的copy

IOUtils.copy(fis,os);

fis.close();

}

@Override

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

this.doGet(request, response);

}

}

4,用户注册登录案例


接下来我们通过两个比较常见的案例,一个是注册,一个是登录来对今天学习的内容进行一个实战演练,首先来实现用户登录。

4.1 用户登录

4.1.1 需求分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BBM7PjYL-1642599750805)(assets/1628865728305.png)]

  1. 用户在登录页面输入用户名和密码,提交请求给LoginServlet

  2. 在LoginServlet中接收请求和数据[用户名和密码]

  3. 在LoginServlt中通过Mybatis实现调用UserMapper来根据用户名和密码查询数据库表

  4. 将查询的结果封装到User对象中进行返回

  5. 在LoginServlet中判断返回的User对象是否为null

  6. 如果为nul,说明根据用户名和密码没有查询到用户,则登录失败,返回"登录失败"数据给前端

  7. 如果不为null,则说明用户存在并且密码正确,则登录成功,返回"登录成功"数据给前端

4.1.2 环境准备
  1. 复制资料中的静态页面到项目的webapp目录下

参考资料\1. 登陆注册案例\1. 静态页面,拷贝完效果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GqUMwl2f-1642599750805)(assets/1628866248169.png)]

  1. 创建db1数据库,创建tb_user表,创建User实体类

2.1 将资料\1. 登陆注册案例\2. MyBatis环境\tb_user.sql中的sql语句执行下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vGkRLopM-1642599750805)(assets/1628866403891.png)]

2.2 将资料\1. 登陆注册案例\2. MyBatis环境\User.java拷贝到com.itheima.pojo

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NYXTJRQm-1642599750805)(assets/1628866560738.png)]

  1. 在项目的pom.xml导入Mybatis和Mysql驱动坐标

org.mybatis

mybatis

3.5.5

mysql

mysql-connector-java

5.1.34

  1. 创建mybatis-config.xml核心配置文件,UserMapper.xml映射文件,UserMapper接口

4.1 将资料\1. 登陆注册案例\2. MyBatis环境\mybatis-config.xml拷贝到resources目录下

<?xml version="1.0" encoding="UTF-8" ?>

4.2 在com.itheima.mapper包下创建UserMapper接口

public interface UserMapper {

}

4.3 将资料\1. 登陆注册案例\2. MyBatis环境\UserMapper.xml拷贝到resources目录下

注意:在resources下创建UserMapper.xml的目录时,要使用/分割

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rsaPXdHM-1642599750806)(assets/1628867237329.png)]

至此我们所需要的环境就都已经准备好了,具体该如何实现?

4.1.3 代码实现
  1. 在UserMapper接口中提供一个根据用户名和密码查询用户对象的方法

/**

  • 根据用户名和密码查询用户对象

  • @param username

  • @param password

  • @return

*/

@Select(“select * from tb_user where username = #{username} and password = #{password}”)

User select(@Param(“username”) String username,@Param(“password”) String password);

说明

@Param注解的作用:用于传递参数,是方法的参数可以与SQL中的字段名相对应。

  1. 修改loign.html
login

LOGIN IN

Username:

Password:

   

没有账号?点击注册

  1. 编写LoginServlet

@WebServlet(“/loginServlet”)

public class LoginServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//1. 接收用户名和密码

String username = request.getParameter(“username”);

String password = request.getParameter(“password”);

//2. 调用MyBatis完成查询

//2.1 获取SqlSessionFactory对象

String resource = “mybatis-config.xml”;

InputStream inputStream = Resources.getResourceAsStream(resource);

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

//2.2 获取SqlSession对象

SqlSession sqlSession = sqlSessionFactory.openSession();

//2.3 获取Mapper

UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

//2.4 调用方法

User user = userMapper.select(username, password);

//2.5 释放资源

sqlSession.close();

//获取字符输出流,并设置content type

response.setContentType(“text/html;charset=utf-8”);

PrintWriter writer = response.getWriter();

//3. 判断user释放为null

if(user != null){

// 登陆成功

writer.write(“登陆成功”);

}else {

// 登陆失败

writer.write(“登陆失败”);

}

}

@Override

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

this.doGet(request, response);

}

}

  1. 启动服务器测试

4.1 如果用户名和密码输入错误,则

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X2qpO92d-1642599750806)(assets/1628867761245.png)]

4.2 如果用户名和密码输入正确,则

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RBfYyBWs-1642599750806)(assets/1628867801708.png)]

至此用户的登录功能就已经完成了~

4.2 用户注册

4.2.1 需求分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BJOiSRXr-1642599750807)(assets/1628867904783.png)]

  1. 用户在注册页面输入用户名和密码,提交请求给RegisterServlet

  2. 在RegisterServlet中接收请求和数据[用户名和密码]

  3. 在RegisterServlet中通过Mybatis实现调用UserMapper来根据用户名查询数据库表

  4. 将查询的结果封装到User对象中进行返回

  5. 在RegisterServlet中判断返回的User对象是否为null

  6. 如果为nul,说明根据用户名可用,则调用UserMapper来实现添加用户

  7. 如果不为null,则说明用户不可以,返回"用户名已存在"数据给前端

4.2.2 代码编写
  1. 编写UserMapper提供根据用户名查询用户数据方法和添加用户方法

/**

  • 根据用户名查询用户对象

  • @param username

  • @return

*/

@Select(“select * from tb_user where username = #{username}”)

User selectByUsername(String username);

/**

  • 添加用户

  • @param user

*/

@Insert(“insert into tb_user values(null,#{username},#{password})”)

void add(User user);

  1. 修改register.html
欢迎注册

最后

对于很多Java工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

再分享一波我的Java面试真题+视频学习详解+技能进阶书籍

美团二面惜败,我的凉经复盘(附学习笔记+面试整理+进阶书籍)

is实现调用UserMapper来根据用户名查询数据库表

  1. 将查询的结果封装到User对象中进行返回

  2. 在RegisterServlet中判断返回的User对象是否为null

  3. 如果为nul,说明根据用户名可用,则调用UserMapper来实现添加用户

  4. 如果不为null,则说明用户不可以,返回"用户名已存在"数据给前端

4.2.2 代码编写
  1. 编写UserMapper提供根据用户名查询用户数据方法和添加用户方法

/**

  • 根据用户名查询用户对象

  • @param username

  • @return

*/

@Select(“select * from tb_user where username = #{username}”)

User selectByUsername(String username);

/**

  • 添加用户

  • @param user

*/

@Insert(“insert into tb_user values(null,#{username},#{password})”)

void add(User user);

  1. 修改register.html
欢迎注册

最后

对于很多Java工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

再分享一波我的Java面试真题+视频学习详解+技能进阶书籍

[外链图片转存中…(img-e5p1iJIv-1714329365472)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值