1、Request对象
用户通过浏览器访问服务器的时候,Tomcat将HTTP请求中所有的信息都封装在Request对象中
开发人员可以通过request对象方法,来获取浏览器发送的所有信息
获取请求行:
请求行:请求方式+请求url+请求协议
String getMethod() 获取请求方式String getMethod() 获取请求方式String getContextPath() 获取项目虚拟路径(项目名)String getRequestURI() 获取URI 项目名/类名StringBuffer getRequestURL() 获取URL http://localhost:8080/项目名/类名String getProtocol() 获取协议和版本号 HTTP/1.1String getRemoteAddr() 获取客户端IP地址
获取请求头:
请求头:请求头名称+请求头值
String getHeader(String name) 获取请求头名称对应的值Enumeration<String> getHeaderNames() 获取所有请求头的名称
获取请求体:
请求体:参数名1+值1&参数名2+值2…
String getParameter(String name) 根据参数名称获取参数值String[] getParameterValues(String name) 根据参数名称获取参数值的数组Enumeration<String> getParameterNames() 获取所有请求的参数名称Map<String,String[]> getParameterMap() 获取所有参数的map集合
乱码问题:
若服务器端(Tomcat:ISO-8859)和客户端(浏览器:GBK)的编码不一致
request.setCharacterEncoding("utf-8"); //必须在行首
2、Request对象的使用
请求转发:
一种在服务器内部的资源跳转方式
1、通过request对象获取转发器对象:RequestDispatcher getRequestDispatcher(String path)2、使用RequesDispatcher对象来进行转发:forward(ServletRequest request,ServletResponse response)二合一:request.getRequestDispatcher("转发资源地址").forward(request,response);
请求转发特点:
1. 浏览器地址栏路径不发生变化2. 只能转发到当前服务器内部资源中。3. 转发是一次请求4. 共享同一个请求中的数据5. 请求转发可以访问WEB-INF目录中的内容
域对象:
一个有作用范围的对象,可以在范围内共享数据
Request,Session,ServletContext(application)
域对象共有方法:
void setAttribute(String name,Object obj) 设置数据Object getAttribute(String name) 获取数据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配置文件中的
<!--全局配置参数:所有的servlet都可以读取...--><context-param><param-name>encode</param-name><param-value>UTF-8</param-value></context-param>// 获取全局参数String value = request.getServletContext().getInitParameter("encode");System.out.println("全局配置参数:"+value);
获取MIME类型:
在互联网通信中定义的一种文件数据类型
大类型/小类型
String filename = req.getParameter("filename");String mimeType = req.getServletContext().getMimeType(filename);System.out.println("文件类型:" + mimeType);
4、Response对象
response对象标识web服务器给浏览器返回的响应信息
设置响应行:格式:协议/版本号:状态码void setStatus(int sc) 设置状态码设置响应头:格式:响应头值void setHeader(String name,String value) 设置指定头名称和对应的值设置响应体:PrintWriter getWriter() 字节输出流,不支持中文,默认编码为ISO-8859-1ServletOutputStream getOutputStream() 字节输出流在同一个servlet中,两种类型的输出流不能同时存在,互斥
5、Response对象的使用
重定向:资源跳转的方式
设置状态码:response.setStatus(302);设置响应头:response.setHeader("Location","重新定向网络地址");sendRedirect(String urlPath) 重定向到指定资源路径
forword与redirect的区别:
重定向:redirect1. 地址栏发生变化2. 重定向可以访问其他站点(服务器)的资源(跨域访问)3. 重定向是两次请求。不能使用request对象来共享数据4. 最终响应给浏览器的由最后一个Servlet来决定响应的内容这个操作相当于把目标的资源路径拷贝到浏览器地址栏中,回车5. URL重写向不能访问WEB-INF目录中的资源~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~转发:forward1. 转发地址栏路径不变2. 转发只能访问当前服务器下的资源3. 转发是一次请求,可以使用request对象来共享数据
forword与redirect的使用场景:
1.分析各自的特点2.必须使用forward* 如果需要共享同一次请求中的数据* 要访问WEB-INF目录下的资源3.如果要跨域访问必须使用redirect4.其他情况根据自己的使用情况来定5.能使用请求转发的就用请求转发
定时刷新:Refresh
// 1. 通过response设置响应头 Refreshresponse.setHeader("Refresh", "3;https://www.baidu.com");response.setContentType("text/html;charset=utf-8");response.getWriter().write("操作成功,3秒后跳转到百度首页...");
用户登录
JDBC工具类:
package com.yunhe.utils;/*@ClassName JDBCUtil@Date 2021/6/11@Time 11:50*/import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;import java.io.InputStream;import java.util.Properties;public class JDBCUtil {private static DataSource dataSource;static{try {//读取配置文件InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("druid.properties");Properties pro = new Properties();pro.load(is);// 创建Druid的数据库连接池对象dataSource = DruidDataSourceFactory.createDataSource(pro);} catch (Exception e) {e.printStackTrace();}}//提供一个方法用于获取连接池public static DataSource getDataSource(){return dataSource;}}
前端html:
<!DOCTYPE html><!--Date: 2021/6/11 Time: 9:29--><html lang="en"><head><meta charset="UTF-8"><title>login</title><style type="text/css">#login{height: 150px;width: 200px;border: 1px solid green;margin: auto;margin-top: 100px;padding-left:30px;padding-top:10px;}#login input{margin-top: 10px}</style></head><body><div id="login"><form action="/loginServlet" method="get">用户名:<input type="text" name="username"><br />密码:<input type="password" name="password"> <br /><input type="submit" value="登录"></form></div></body></html>
后端domain:
package com.yunhe.domain;/*@ClassName User@Date 2021/6/11@Time 9:34*/public class User {private int uid;private String username;private String password;//省略get/set//省略无参和有参}
后端servlet&登录结果:
package com.yunhe.web;import com.yunhe.domain.User;import com.yunhe.service.Userservice;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;@WebServlet("/loginServlet")public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {Userservice userservice = new Userservice();String username = request.getParameter("username");String password = request.getParameter("password");User user = new User(username,password);if (userservice.login(user)!=null){request.setAttribute("msg","登录成功!欢迎你,"+username);request.getRequestDispatcher("/okServlet").forward(request,response);}else{request.setAttribute("msg","登录失败!请从重新登录,"+username);request.getRequestDispatcher("/okServlet").forward(request,response);}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 处理post请求乱码问题request.setCharacterEncoding("utf-8");// 响应参数乱码解决方法response.setContentType("text/html;charset=UTF-8");this.doGet(request, response);}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~package com.yunhe.web;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;@WebServlet("/okServlet")public class okServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");// 处理post请求乱码问题response.setContentType("text/html;charset=UTF-8"); // 响应参数乱码解决方法response.getWriter().write("<h1>"+request.getAttribute("msg")+"</h1>");}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}}
后端service:
package com.yunhe.service;/*@ClassName Userservice@Date 2021/6/11@Time 9:37*/import com.yunhe.dao.UserDao;import com.yunhe.domain.User;public class Userservice {UserDao userDao = new UserDao();//登录public User login(User user) {return userDao.login(user);}}
后端dao:
package com.yunhe.dao;/*@ClassName UserDao@Date 2021/6/11@Time 9:38*/import com.yunhe.domain.User;import com.yunhe.utils.JDBCUtil;import org.springframework.jdbc.core.BeanPropertyRowMapper;import org.springframework.jdbc.core.JdbcTemplate;public class UserDao {JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtil.getDataSource());public User login(User user) {String sql="select * from zw_user where username=? and password = ?";try {//执行sql语句User userLogin = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class),user.getUsername(), user.getPassword());return userLogin;}catch (Exception e){e.printStackTrace();return null;}}}
文件下载
前端html:
<!DOCTYPE html><!--Date: 2021/6/11 Time: 14:06--><html lang="en"><head><meta charset="UTF-8"><title>未命名</title><style type="text/css"></style></head><body><p><a href="/downLoadServlet?filename=java.docx">doc文档</a></p><p><a href="/downLoadServlet?filename=java.jpg">jpg图片</a></p><script type="text/javascript"></script></body></html>
后端download:
package com.download;import com.util.DownLoadUtils;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.ServletInputStream;import javax.servlet.ServletOutputStream;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.File;import java.io.FileInputStream;import java.io.IOException;@WebServlet("/downLoadServlet")public class DownLoadServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");// 处理post请求乱码问题response.setContentType("text/html;charset=UTF-8"); // 响应参数乱码解决方法String filename = request.getParameter("filename");//获取前端传过来的文件名//获取服务器文件的真实路径ServletContext servletContext = this.getServletContext(); //获取项目路径filename = servletContext.getRealPath("/down/" + filename); //拼接项目路径和文件名//读取文件//创建本地流FileInputStream fis = new FileInputStream(new File(filename));// 获取文件的真实类型String mimeType = servletContext.getMimeType(filename);//设置响应头response.setHeader("Content-Type",mimeType); //响应头名称+,+获取的文件的真实类型//获取获取访问的浏览器类型String useragent = request.getHeader("user-agent");filename = DownLoadUtils.getName(useragent, filename); //解决浏览器中文兼容问题// 设置以附件的形式打开文件response.setHeader("content-disposition","attachment;filename="+filename);// 获取字节输出流ServletOutputStream os = response.getOutputStream();//读取文件int len ;byte[] bys = new byte[1024];while ((len = fis.read(bys))!=-1){os.write(bys,0,len);}//释放资源os.close();fis.close();}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}}
后端判断访问浏览器类型工具类:
package com.util;import sun.misc.BASE64Encoder;import java.io.UnsupportedEncodingException;import java.net.URLEncoder;/*解决浏览器中文兼容性的问题的*/public class DownLoadUtils {public static String getName(String agent, String filename) throws UnsupportedEncodingException {if (agent.contains("Firefox")) {// 火狐浏览器BASE64Encoder base64Encoder = new BASE64Encoder();filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";} else {// 其它浏览器filename = URLEncoder.encode(filename, "utf-8");}return filename;}}
