Request
什么是request
http协议中的request:http协议>超文本传输协议
http协议的默认端口是80
Servlet中的request
HttpServletRequest对象,在改接口中定义了获取请求头,请求行,和请求体的方法
获取请求行
String getMethod() //获取请求头中请求的类型 GET POST
String getContextPath() // 获取请求行中项目访问路径
@WebServlet("/header")
public class GetHeaderServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求方式(Get,Post)
String header = request.getMethod(); //GET
//获取访问的项目名
String result = request.getContextPath(); ///webDay04_war_exploded
System.out.println("请求方式为"+header);
System.out.println("请求路径名为"+result);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
获取请求头
String getHeader(String name)//根据键名获取值
Enumeration getHeaderNames(); //获取所有请求头
Enumeration迭代器 hasMoreElement() nextElement()
例如:获取浏览器的类型(User-Agnet)
用于做浏览器的兼容
@WebServlet("/header")
public class GetHeaderServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//用于获取访问的浏览器
String name = request.getHeader("User-Agent");
System.out.println(name);
//获取所有请求头信息
//返回的是一个Enumeration迭代器 其中有两个主要的方法 hasMoreElement() nextElement()
Enumeration<String> headerNames = request.getHeaderNames();
//遍历获取里面的内容
while (headerNames.hasMoreElements()){
//获取到键值
String key = headerNames.nextElement();
//根据键名获取值
String value = request.getHeader(key);
//输出打印
System.out.println(key +":"+ value);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
Enumeration
基本方法
如何遍历
//遍历获取里面的内容
while (en.hasMoreElements()){
//获取到键值
String key = en.nextElement();
//输出打印
System.out.println(key );
}
项目的访问路径与项目名称没有任何关系
修改项目访问地址名称
请求头,请求行,请求体(http中request)
get请求
只有请求头与请求行,因为请求体在请求行中
post请求
请求体是浏览器真正要发给服务器的数据
修改欢迎页
request对象的方法
获取参数
String getParameter(String name)//参数 一个值时
String[] getParameterValues(String name)// 获取多个值时
//获取所有的参数名和参数值
Map<String,String> map = request.getParameterValues(String name)(很少单独使用,会与BeanUtils一起使用)
//根据参数名,获取到值
String username = request.getParameter("username");
//获取到该参数名的多个值
String[] hobbies = request.getParameterValues("hobby");
//获取到前端所有数据
Map<String, String[]> map = request.getParameterMap();
处理中文
Tomcat8.5 已默认可以处理GET请求的中文提交,但是没有处理POST的中文提交
//设置请求体的数据的编码为utf-8
request.setCharacterEncoding("UTF-8");
BeanUtils工具类
BeanUtils是Apache Commons组件的成员之一,主要用于简化JavaBean封装数据的操作。
使用时,需要导包
BeanUtils中的populate类
使用步骤:
- 添加jar到web/WEB_INF/lib目录
- 让 idea识别
- 选中jar包—>右键,选择add AS Libary
- 调用populate()方法
参数的参数名与类的成员变量名一致
前端页面
user类
使用BeanUtils
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//创建一个用户对象
User user = new User();
//获取到前端所有数据
Map<String, String[]> map = request.getParameterMap();
//由于前端页面的参数太多,所以使用BeanUtils工具包来直接获取前端输入框中的数据
try {
BeanUtils.populate(user,map);
} catch (Exception e) {
e.printStackTrace();
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
请求转发和重定向
转发与重定向的区别
什么是转发
浏览器访问Servlet1,Servlet1将参数处理得到结果,没有直接返回给浏览器,而是将结果带给Servlet2,由servlet2再处理之后返回给浏览器。
请求转发
request.getRequestDispatcher(地址).forward(request,response);
如果HTML文件是存放在WEB_INF目录下的,那么只能使用请求转发。