用户登录案例需求:
1.编写login.html登录页面
username & password 两个输入框
2.使用Druid数据库连接池技术,操作mysql,数据库中user表
3.使用JdbcTemplate技术封装JDBC
4.登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您
5.登录失败跳转到FailServlet展示:登录失败,用户名或密码错
HTTP协议:
请求消息:客户端发送给服务器端的数据
数据格式:
请求行
请求头
请求空行
请求体
响应消息:服务器端发送给客户端的数据
数据格式:
响应行
组成:协议/版本 响应状态码 状态码描述
响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。
- 状态码都是3位数字
- 分类:
- 1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
- 2xx:成功。代表:200
- 3xx:重定向。代表:302(重定向),304(访问缓存)
- 4xx:客户端错误。
- 代表:
- 404(请求路径没有对应的资源)
- 405:请求方式没有对应的doXxx方法
- 5xx:服务器端错误。代表:500(服务器内部出现异常)
响应头: - 格式:头名称: 值
- 常见的响应头:
- Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
- Content-disposition:服务器告诉客户端以什么格式打开响应体数据
- 值:
- in-line:默认值,在当前页面内打开
- attachment;filename=xxx:以附件形式打开响应体。文件下载
- 响应空行
- 响应体:传输的数据
Response对象
功能:设置响应消息
设置响应行
格式:HTTP/1.1 200 ok
设置状态码:setStatus(int sc)
设置响应头:setHeader(String name, String value)
案例:
完成重定向
重定向:资源跳转的方式
重定向和转发的区别( forward 和 redirect 区别)
重定向的特点:
1、 地址栏发生变化
2、重定向可以访问其他站点的资源
3、重定向是两次请求,不能使用request域对象来共享数据
转发的特点:
1、地址栏路径不变
2、转发不能访问其他站点的资源
3、转发是一次请求,可以使用request域对象来共享数据
1.设置流的编码方式
req.setCharacterEncoding("utf-8");
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.设置流的编码方式
req.setCharacterEncoding("utf-8");
// //根据参数名称获取参数值
// String username = req.getParameter("username");
// System.out.println(username);
// //根据参数名获取参数值的数组
// String[] hobbies = req.getParameterValues("hobby");
// for (String hobby:hobbies){
// System.out.println(hobby);
// }
// //获取所有请求参数名称
Enumeration<String> parameterNames = req.getParameterNames();
while (parameterNames.hasMoreElements()){
String name = parameterNames.nextElement();
System.out.println(name);
System.out.println("==================");
String value = req.getParameter(name);
System.out.println(value);
System.out.println("==================");
}
// Enumeration<String> parameterNames = req.getParameterNames();
// while (parameterNames.hasMoreElements()){
// String name = parameterNames.nextElement();
// System.out.println(name);
// System.out.println("==============");
// String value = req.getParameter(name);
// System.out.println(value);
// System.out.println("==============");
// }
// 获取所有参数的map集合
// Map<String, String[]> parameterMap = req.getParameterMap();
// Set<String> keySet = parameterMap.keySet();
// for (String name:keySet){
// String[] vlaues = parameterMap.get(name);
// System.out.println(name);
// for (String value: vlaues){
// System.out.println(value);
// }
// System.out.println("++++++++++++++++++");
// }
}
转发
@WebServlet("/requestDemo4")
public class RequestDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//转发
// RequestDispatcher requestDispatcher = req.getRequestDispatcher("/requestDemo5");
// requestDispatcher.forward(req,resp);
//转发时存储数据到request域中
req.setAttribute("msg","hello");
req.getRequestDispatcher("/requestDemo5").forward(req,resp);
//转发到指定的地址 只能转发当前项目下的地址 ,外部的不行
// req.getRequestDispatcher("http://www.neusoft.com").forward(req,resp);
//转发时存储数据到request域中 (练习)
// req.setAttribute("123","321");
// RequestDispatcher requestDispatcher = req.getRequestDispatcher("/requestDemo5");
// requestDispatcher.forward(req,resp);
}
}
重定向
@WebServlet("/responseDemo1")
public class ResponseDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo1……");
//重定向
// // 方法一(不常用):设置状态码是302
// resp.setStatus(302);
//// //设置响应头 location
// resp.setHeader("location","/responseDemo2");
//方式二: 这个方法获取不到值 结果为null ,但是可以跳转到特定网址
// req.setAttribute("mgs", "response_success");
// resp.sendRedirect("/responseDemo2");
resp.sendRedirect("http://www.baidu.com");
}
}