1、Request对象

用户通过浏览器访问服务器的时候,Tomcat将HTTP请求中所有的信息都封装在Request对象中
开发人员可以通过request对象方法,来获取浏览器发送的所有信息

获取请求行:

请求行:请求方式+请求url+请求协议

  1. String getMethod() 获取请求方式
  2. String getMethod() 获取请求方式
  3. String getContextPath() 获取项目虚拟路径(项目名)
  4. String getRequestURI() 获取URI 项目名/类名
  5. StringBuffer getRequestURL() 获取URL http://localhost:8080/项目名/类名
  6. String getProtocol() 获取协议和版本号 HTTP/1.1
  7. String getRemoteAddr() 获取客户端IP地址

获取请求头:

请求头:请求头名称+请求头值

  1. String getHeader(String name) 获取请求头名称对应的值
  2. Enumeration<String> getHeaderNames() 获取所有请求头的名称

获取请求体:

请求体:参数名1+值1&参数名2+值2…

  1. String getParameter(String name) 根据参数名称获取参数值
  2. String[] getParameterValues(String name) 根据参数名称获取参数值的数组
  3. Enumeration<String> getParameterNames() 获取所有请求的参数名称
  4. Map<String,String[]> getParameterMap() 获取所有参数的map集合

乱码问题:

若服务器端(Tomcat:ISO-8859)和客户端(浏览器:GBK)的编码不一致

  1. request.setCharacterEncoding("utf-8"); //必须在行首

2、Request对象的使用

请求转发:

一种在服务器内部的资源跳转方式

  1. 1、通过request对象获取转发器对象:
  2. RequestDispatcher getRequestDispatcherString path
  3. 2、使用RequesDispatcher对象来进行转发:
  4. forwardServletRequest requestServletResponse response
  5. 二合一:
  6. request.getRequestDispatcher("转发资源地址").forward(request,response);

请求转发特点:

  1. 1. 浏览器地址栏路径不发生变化
  2. 2. 只能转发到当前服务器内部资源中。
  3. 3. 转发是一次请求
  4. 4. 共享同一个请求中的数据
  5. 5. 请求转发可以访问WEB-INF目录中的内容

域对象:

一个有作用范围的对象,可以在范围内共享数据
Request,Session,ServletContext(application)
域对象共有方法:

  1. void setAttribute(String name,Object obj) 设置数据
  2. Object getAttribute(String name) 获取数据
  3. void removeAttribute(String name) 删除数据

3、ServletContext对象

servlet上下文,全局唯一,工程内部所有servlet共享这个对象
1、是一个域对象
2、可以读取全局配置参数
3、可以搜索当前工程目录下面的资源文件
4、可以获取当前工程名字

通过request对象获取:

ServletContext sc = request.getServletContext();

通过this获取:

ServletContext sc = this.getServletContext();

ServletContext生命周期:

1、创建
项目加载时,创建
2、销毁
项目卸载时,销毁
3、作用范围
与项目共存亡(多个servlet都可以操作它)

获取资源真实路径:

动态获取文件的真实路径
String getRealPath(String path)

获取全局配置参数:

读取web配置文件中的标签信息

  1. <!--全局配置参数:所有的servlet都可以读取...-->
  2. <context-param>
  3. <param-name>encode</param-name>
  4. <param-value>UTF-8</param-value>
  5. </context-param>
  6. // 获取全局参数
  7. String value = request.getServletContext().getInitParameter("encode");
  8. System.out.println("全局配置参数:"+value);

获取MIME类型:

在互联网通信中定义的一种文件数据类型
大类型/小类型

  1. String filename = req.getParameter("filename");
  2. String mimeType = req.getServletContext().getMimeType(filename);
  3. System.out.println("文件类型:" + mimeType);

4、Response对象

response对象标识web服务器给浏览器返回的响应信息

  1. 设置响应行:
  2. 格式:协议/版本号:状态码
  3. void setStatus(int sc) 设置状态码
  4. 设置响应头:
  5. 格式:响应头值
  6. void setHeader(String name,String value) 设置指定头名称和对应的值
  7. 设置响应体:
  8. PrintWriter getWriter() 字节输出流,不支持中文,默认编码为ISO-8859-1
  9. ServletOutputStream getOutputStream() 字节输出流
  10. 在同一个servlet中,两种类型的输出流不能同时存在,互斥

5、Response对象的使用

重定向:资源跳转的方式

  1. 设置状态码:
  2. response.setStatus(302);
  3. 设置响应头:
  4. response.setHeader("Location","重新定向网络地址");
  5. sendRedirect(String urlPath) 重定向到指定资源路径

forword与redirect的区别:

  1. 重定向:redirect
  2. 1. 地址栏发生变化
  3. 2. 重定向可以访问其他站点(服务器)的资源(跨域访问)
  4. 3. 重定向是两次请求。不能使用request对象来共享数据
  5. 4. 最终响应给浏览器的由最后一个Servlet来决定响应的内容
  6. 这个操作相当于把目标的资源路径拷贝到浏览器地址栏中,回车
  7. 5. URL重写向不能访问WEB-INF目录中的资源
  8. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  9. 转发:forward
  10. 1. 转发地址栏路径不变
  11. 2. 转发只能访问当前服务器下的资源
  12. 3. 转发是一次请求,可以使用request对象来共享数据

forword与redirect的使用场景:

  1. 1.分析各自的特点
  2. 2.必须使用forward
  3. * 如果需要共享同一次请求中的数据
  4. * 要访问WEB-INF目录下的资源
  5. 3.如果要跨域访问必须使用redirect
  6. 4.其他情况根据自己的使用情况来定
  7. 5.能使用请求转发的就用请求转发

定时刷新:Refresh

  1. // 1. 通过response设置响应头 Refresh
  2. response.setHeader("Refresh", "3;https://www.baidu.com");
  3. response.setContentType("text/html;charset=utf-8");
  4. response.getWriter().write("操作成功,3秒后跳转到百度首页...");

用户登录

JDBC工具类:

  1. package com.yunhe.utils;
  2. /*
  3. @ClassName JDBCUtil
  4. @Date 2021/6/11
  5. @Time 11:50
  6. */
  7. import com.alibaba.druid.pool.DruidDataSourceFactory;
  8. import javax.sql.DataSource;
  9. import java.io.InputStream;
  10. import java.util.Properties;
  11. public class JDBCUtil {
  12. private static DataSource dataSource;
  13. static{
  14. try {
  15. //读取配置文件
  16. InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("druid.properties");
  17. Properties pro = new Properties();
  18. pro.load(is);
  19. // 创建Druid的数据库连接池对象
  20. dataSource = DruidDataSourceFactory.createDataSource(pro);
  21. } catch (Exception e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. //提供一个方法用于获取连接池
  26. public static DataSource getDataSource(){
  27. return dataSource;
  28. }
  29. }

前端html:

  1. <!DOCTYPE html>
  2. <!--Date: 2021/6/11 Time: 9:29-->
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>login</title>
  7. <style type="text/css">
  8. #login{
  9. height: 150px;
  10. width: 200px;
  11. border: 1px solid green;
  12. margin: auto;
  13. margin-top: 100px;
  14. padding-left:30px;
  15. padding-top:10px;
  16. }
  17. #login input{
  18. margin-top: 10px
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <div id="login">
  24. <form action="/loginServlet" method="get">
  25. 用户名:<input type="text" name="username"><br />
  26. 密码:<input type="password" name="password"> <br />
  27. <input type="submit" value="登录">
  28. </form>
  29. </div>
  30. </body>
  31. </html>

后端domain:

  1. package com.yunhe.domain;
  2. /*
  3. @ClassName User
  4. @Date 2021/6/11
  5. @Time 9:34
  6. */
  7. public class User {
  8. private int uid;
  9. private String username;
  10. private String password;
  11. //省略get/set
  12. //省略无参和有参
  13. }

后端servlet&登录结果:

  1. package com.yunhe.web;
  2. import com.yunhe.domain.User;
  3. import com.yunhe.service.Userservice;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import java.io.IOException;
  10. @WebServlet("/loginServlet")
  11. public class LoginServlet extends HttpServlet {
  12. @Override
  13. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  14. Userservice userservice = new Userservice();
  15. String username = request.getParameter("username");
  16. String password = request.getParameter("password");
  17. User user = new User(username,password);
  18. if (userservice.login(user)!=null){
  19. request.setAttribute("msg","登录成功!欢迎你,"+username);
  20. request.getRequestDispatcher("/okServlet").forward(request,response);
  21. }else{
  22. request.setAttribute("msg","登录失败!请从重新登录,"+username);
  23. request.getRequestDispatcher("/okServlet").forward(request,response);
  24. }
  25. }
  26. @Override
  27. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  28. // 处理post请求乱码问题
  29. request.setCharacterEncoding("utf-8");
  30. // 响应参数乱码解决方法
  31. response.setContentType("text/html;charset=UTF-8");
  32. this.doGet(request, response);
  33. }
  34. }
  35. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  36. package com.yunhe.web;
  37. import javax.servlet.ServletException;
  38. import javax.servlet.annotation.WebServlet;
  39. import javax.servlet.http.HttpServlet;
  40. import javax.servlet.http.HttpServletRequest;
  41. import javax.servlet.http.HttpServletResponse;
  42. import java.io.IOException;
  43. @WebServlet("/okServlet")
  44. public class okServlet extends HttpServlet {
  45. @Override
  46. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  47. request.setCharacterEncoding("utf-8");// 处理post请求乱码问题
  48. response.setContentType("text/html;charset=UTF-8"); // 响应参数乱码解决方法
  49. response.getWriter().write("<h1>"+request.getAttribute("msg")+"</h1>");
  50. }
  51. @Override
  52. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  53. this.doPost(request, response);
  54. }
  55. }

后端service:

  1. package com.yunhe.service;
  2. /*
  3. @ClassName Userservice
  4. @Date 2021/6/11
  5. @Time 9:37
  6. */
  7. import com.yunhe.dao.UserDao;
  8. import com.yunhe.domain.User;
  9. public class Userservice {
  10. UserDao userDao = new UserDao();
  11. //登录
  12. public User login(User user) {
  13. return userDao.login(user);
  14. }
  15. }

后端dao:

  1. package com.yunhe.dao;
  2. /*
  3. @ClassName UserDao
  4. @Date 2021/6/11
  5. @Time 9:38
  6. */
  7. import com.yunhe.domain.User;
  8. import com.yunhe.utils.JDBCUtil;
  9. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  10. import org.springframework.jdbc.core.JdbcTemplate;
  11. public class UserDao {
  12. JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtil.getDataSource());
  13. public User login(User user) {
  14. String sql="select * from zw_user where username=? and password = ?";
  15. try {
  16. //执行sql语句
  17. User userLogin = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class),
  18. user.getUsername(), user.getPassword());
  19. return userLogin;
  20. }catch (Exception e){
  21. e.printStackTrace();
  22. return null;
  23. }
  24. }
  25. }

文件下载

前端html:

  1. <!DOCTYPE html>
  2. <!--Date: 2021/6/11 Time: 14:06-->
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>未命名</title>
  7. <style type="text/css">
  8. </style>
  9. </head>
  10. <body>
  11. <p><a href="/downLoadServlet?filename=java.docx">doc文档</a></p>
  12. <p><a href="/downLoadServlet?filename=java.jpg">jpg图片</a></p>
  13. <script type="text/javascript">
  14. </script>
  15. </body>
  16. </html>

后端download:

  1. package com.download;
  2. import com.util.DownLoadUtils;
  3. import javax.servlet.ServletContext;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.ServletInputStream;
  6. import javax.servlet.ServletOutputStream;
  7. import javax.servlet.annotation.WebServlet;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. import java.io.File;
  12. import java.io.FileInputStream;
  13. import java.io.IOException;
  14. @WebServlet("/downLoadServlet")
  15. public class DownLoadServlet extends HttpServlet {
  16. @Override
  17. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  18. request.setCharacterEncoding("utf-8");// 处理post请求乱码问题
  19. response.setContentType("text/html;charset=UTF-8"); // 响应参数乱码解决方法
  20. String filename = request.getParameter("filename");//获取前端传过来的文件名
  21. //获取服务器文件的真实路径
  22. ServletContext servletContext = this.getServletContext(); //获取项目路径
  23. filename = servletContext.getRealPath("/down/" + filename); //拼接项目路径和文件名
  24. //读取文件
  25. //创建本地流
  26. FileInputStream fis = new FileInputStream(new File(filename));
  27. // 获取文件的真实类型
  28. String mimeType = servletContext.getMimeType(filename);
  29. //设置响应头
  30. response.setHeader("Content-Type",mimeType); //响应头名称+,+获取的文件的真实类型
  31. //获取获取访问的浏览器类型
  32. String useragent = request.getHeader("user-agent");
  33. filename = DownLoadUtils.getName(useragent, filename); //解决浏览器中文兼容问题
  34. // 设置以附件的形式打开文件
  35. response.setHeader("content-disposition","attachment;filename="+filename);
  36. // 获取字节输出流
  37. ServletOutputStream os = response.getOutputStream();
  38. //读取文件
  39. int len ;
  40. byte[] bys = new byte[1024];
  41. while ((len = fis.read(bys))!=-1){
  42. os.write(bys,0,len);
  43. }
  44. //释放资源
  45. os.close();
  46. fis.close();
  47. }
  48. @Override
  49. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  50. this.doPost(request, response);
  51. }
  52. }

后端判断访问浏览器类型工具类:

  1. package com.util;
  2. import sun.misc.BASE64Encoder;
  3. import java.io.UnsupportedEncodingException;
  4. import java.net.URLEncoder;
  5. /*
  6. 解决浏览器中文兼容性的问题的
  7. */
  8. public class DownLoadUtils {
  9. public static String getName(String agent, String filename) throws UnsupportedEncodingException {
  10. if (agent.contains("Firefox")) {
  11. // 火狐浏览器
  12. BASE64Encoder base64Encoder = new BASE64Encoder();
  13. filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
  14. } else {
  15. // 其它浏览器
  16. filename = URLEncoder.encode(filename, "utf-8");
  17. }
  18. return filename;
  19. }
  20. }