Request快速入门!!!
Request简述
什么是request?HTTP协议中的request,Servlet中的request
Http
超文本传输协议,用于定义web浏览器与web服务器之间交换数据的过程!
默认端口:80
Http请求
- 请求行
- get方式:请求方式/请求地址/请求参数/协议
- post方式:请求不会将请求参数放到请求行中,而是放到了请求体中
- 请求头
- 请求体(get请求没有请求体)
Request-获取请求行
两种方式:get,post
- getMethod()
- getContextPath():获取请求行中的项目地址
String path = request.getContentPath();
Request-获取请求头
- getHeader():获取请求头中的一个键对应的一个值
//获取浏览器的类型
String type = request.getHeader("User-Agent");
System.out.println(type);
Request-获取请求体-获取参数-解决中文乱码问题
//1.获取请求体中的参数
//get请求没有请求体,也可以通过这个方法来获取参数
String username = request.getParameter("username"); //传入的参数要和表单中的name的值相同才可以获取
String password = requestt.getParameter("password");
-
中文传输乱码问题
tomcat 8.5 默认可以处理get请求中的中文
如果是POST请求,需要自己手动设置编码 setCharactEncoding()
request.setCharacterEncoding("UTF-8");
Request-获取请求体-获取多个值
- String[] values = getParameterValues(String name)
- Map<String,String[]> getParameterMap();
//获取多个值,将传过来的值封装到map中
Map<String,String[]> map = request.getParamterMap();
Set<String> keys = map.keySet();
for (String key : keys) {
System.out.println(key + " " Arrayy.toString(map.get(key));
}
apache BeanUtils工具类
BeanUtils是什么?是apache组件的成员之一,主要用于简化JavaBean封装数据的操作,需要导入jar包
//在没有使用BeanUtils,封装JavaBean很麻烦
//1.获取所有的参数
Map<String,String[]> map = request.getParameterMap();
String[] usernames = map.get("username");
String[] passwords = map.get("password")
//2.一个个封装
User user = new User();
user.setUsername(usernames[0]);
user.setPassword(password[0]);
.....
.....
BeanUtils-populate
//populate(Object o,Map map),将要封装的对象和封装的集合传个参数
//注意!!!必须要让参数的参数名与类成员变量名一致
try {
BeanUtils.populate(user,map);
} catch (Exception e) {
e.printStack()
}
System.out.prinln(user);
底层源码分析
获取key,生成set方法
如:key-username ---->setUsername
调用对象中同名的set方法封装值
request-转发(forward)
什么是请求转发,浏览器访问Servlet1,Servlet1处理请求得到结果,没有将结果返回给浏览器,而是将请求转发到Servlet2,由Servlet2再处理之后返回给浏览器。
请求转发的方法
-
setAttribute(String key,Object o): 给请求域中设置值
-
getAttribute(String key):获取请求域中的值
-
getRequestDispatcher("/demo").forward(request,response); 请求转发
//将“游戏本”转发到下一个Servlet //1.存数据 request.setAttribute("name","游戏本"); request.getRequestDispatcher("/demo02").forward(request.response);
//在另一个Servlet中获取转发过来的数据,组装渲染后响应到浏览器 String name = request.getAttribute("name"); response.setContentType("text/html;charset=utf-8"); response.getWriter().write("<font color='red'>" + name + "</font>");
请求转发与重定向的区别
-
重定向:
- 两次请求,两次响应
- 重定向不携带数据
- 地址栏发生变化
-
转发
- 一次请求,一次响应
- 转发携带数据
- 地址栏不发生变化
案例-登录注册功能
//一个简易的注册的servlet
@WebServlet("/register")
public class Demo02_RegisterServlet extends HttpServlet {
private UserService userService = new UserService();
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取请求参数
Map<String, String[]> map = request.getParameterMap();
User user = new User();
BeanUtils.populate(user,map);
boolean flag = userService.register(user);
if (flag) {
response.sendRedirect(request.getContextPath() + "login.jsp");
} else {
response.getWriter().write("注册失败!");
}
}
}
登录
@WebServlet("/login")
public class Demo02_LoginServlet extends HttpServlet {
private UserService userService = new UserService();
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取请求参数
String username = request.getParameter("username");
String password = request.getParameter("password");
User user = userService.login(username,password);
if (user != null) {
//如果登录成功,将用户信息存到session,转发到首页
HttpSession session = request.getSession();
session.setAttribute("user",user);
request.getRequestDispatcher("index.jsp").forward(request,response);
} else {
//将错误信息转发到登录页面
request.setAttribute("message","用户名或密码错误!");
request.getRequestDispatcher("login.jsp").forward(request,response);
}
}
}