JavaWeb——HttpServletRequest

Servlet的API种提供了一个类 ServletRequest ,是一个请求对象,封装浏览器发送的请求信息,但不能封装HTTP协议。

HttpServletRequest对象:继承 ServletRequest ,遵循HTTP协议,可以处理HTTP的请求信息。

获取请求对象参数的常用方法:

getParameter(String name) 获取浏览器提交数据,根据指定name属性值获取数据,如果没有name属性值,返回null。如果有名称,但是没有值,返回空串。如果有多个相同名称,返回第一个值。
getParameterValues(String name); 获取浏览器的提交数据,根据指定name属性值获取数据。获取一组数据。 常用就是获取复选框的值。
getParamaterMap(); 获取浏览器表单提交的数据,将表单中的值封装到一个map集合中。 Key就是name的属性值,map中value就是表单中的value

BeanUtils.populate(bean,map);可以将map集合中的元素封装到bean中。

注意事项:

1:map集合中的key必须跟bean中setXXX一致。
2:map集合中key的类型必须是跟bean中属性的类型一致。

日期类型转换器:

		//自定义日期转换器
		DateConverter dateConverter = new DateConverter();
		//定义需要转换的格式
		dateConverter.setPatterns(new String[] {"yyyy-MM-dd hh:mmss","yyyy-MM-dd"});
		//注册转换器
		ConvertUtils.register(dateConverter, java.util.Date.class);

在获取get请求时可能出现中文乱码,可修改服务器配置文件,来解决。

解决post中文乱码:

request.setCharacterEncoding("UTF-8");

request操作请求行

方法声明 功能描述
String getMethod() 该方法用于获取HTTP请求消息中的请求方式(如GET、POST等)   忽略大小写判断请求方式  
String getRequestURI() 该方法用于获取请求行中资源名称部分,即位于URL的主机和端口之后、参数部分之前的部分   仅获取资源名,不包含参数列表  
String getQueryString() 该方法用于获取请求行中的参数部分,也就是资源路径后面问号(?)以后的所有内容
String getProtocol() 该方法用于获取请求行中的协议名和版本,例如,HTTP/1.0或HTTP/1.1
String getContextPath() 该方法用于获取请求URL中属于WEB应用程序的路径,这个路径以“/”开头,表示相对于整个WEB站点的根目录,路径结尾不含“/”。如果请求URL属于WEB站点的根目录,那么返回结果为空字符串("")   动态获取项目名称。  
String getServletPath() 该方法用于获取Servlet的名称或Servlet所映射的路径
String getRemoteAddr() 该方法用于获取请求客户端的IP地址,其格式类似于“192.168.0.3”   本机: 0:0:0:0:0:0:0:1 localhost 127.0.0.1   统计IP  
String getRemoteHost() 该方法用于获取请求客户端的完整主机名,需要注意的是,如果无法解析出客户机的完整主机名,该方法将会返回客户端的IP地址
int getRemotePort() 该方法用于获取请求客户端网络连接的端口号
String getLocalAddr() 该方法用于获取Web服务器上接收当前请求网络连接的IP地址
String getLocalName() 该方法用于获取Web服务器上接收当前网络连接IP所对应的主机名
int getLocalPort() 该方法用于获取Web服务器上接收当前网络连接的端口号 接收请求的端口号
String getServerName() 该方法用于获取当前请求所指向的主机名,即HTTP请求消息中Host头字段所对应的主机名部分
int getServerPort() 该方法用于获取当前请求所连接的服务器端口号,即如果HTTP请求消息中Host头字段所对应的端口号部分 发送响应的端口号
String getScheme() 该方法用于获取请求的协议名,例如http、https或ftp
StringBuffer getRequestURL() 该方法用于获取客户端发出请求时的完整URL,包括协议、服务器名、端口号、资源路径等信息,但不包括后面的查询参数部分。注意,getRequestURL()方法返回的结果是StringBuffer类型,而不是String类型,这样更便于对结果进行修改   获取到包含http协议的资源路径,不包含参数列表  

request操作请求头

方法声明 功能描述
String getHeader(String name) 该方法用于获取一个指定头字段的值,如果请求消息中没有包含指定的头字段,getHeader()方法返回null;如果请求消息中包含有多个指定名称的头字段,getHeader()方法返回其中第一个头字段的值
Enumeration getHeaders(String name) 该方法返回一个Enumeration集合对象,该集合对象由请求消息中出现的某个指定名称的所有头字段值组成。在多数情况下,一个头字段名在请求消息中只出现一次,但有时候可能会出现多次
Enumeration getHeaderNames() 该方法用于获取一个包含所有请求头字段的Enumeration对象
int getIntHeader(String name) 该方法用于获取指定名称的头字段,并且将其值转为int类型。需要注意的是,如果指定名称的头字段不存在,返回值为-1;如果获取到的头字段的值不能转为int类型,将发生NumberFormatException异常
Long getDateHeader(String name) 该方法用于获取指定头字段的值,并将其按GMT时间格式转换成一个代表日期/时间的长整数,这个长整数是自1970年1月1日0点0分0秒算起的以毫秒为单位的时间值

request操作请求体

Get请求数据都在请求行中。请求体是空的。
只有post请求才有请求体。
getParameter(String name)
getParameterValues(String name);

request和response的执行流程

浏览器发送请求→



←响应请求
服务器

将请求数据封装到Request对象中,并创建一个空白的Response响应对象。

URL-Pattern

Servlet

将响应信息存入Response对象

请求转发 :

作用:实现多个servlet 联动操作处理请求,这样避免代码冗余,让servlet 的职责更加明确。
在服务器内部进行数据传递和需求转发。

 req.getRequestDispatcher("要转发的地址").forward(req,resp);

//地址:相对路径,直接书写servlet 的别名即可。

特点: 一次请求,浏览器地址栏信息不改变。

注意:

  • 请求转发后直接return结束即可
  • 解决的问题:服务器在接收到浏览器的请求后,仅仅使用一个Servlet 进行处理,会造成不同的Servlet逻辑代码冗余,Servlet 的职责不明确。

reuqet作用域: 解决了一次请求内的servlet之间的数据共享问题

重定向:

  • 解决了表单重复提交的问题,以及当前servlet无法处理的请求的问题。
  • 使用:
  • resp.sendRedirect(String uri);
  • 示例:
  • resp.sendRedirect("/login/main");
  • 特点:
  • 两次请求,两个request对象。
  • 浏览器地址栏信息改变
  • 时机:
  • 如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向。
  • 如果请求被Servlet接收后,无法进行处理,建议使用重定向定位到可以处理的资源

Request作用域:request对象可以存、取数据。作用域说得就是作用范围。
常用方法跟ServletContext域对象中的方法一样。
setAttribute(String key,Object value);
getAttribute(String key);
removeAttribute(String key);

使用请求转发:

  • 要求安全,不暴露程序路径
  • 要求高效
  • 使用request作用域
  • 访问受保护目录资源

使用重定向:

  • 跳转外网资源
  • 改变地址栏路径

jingsongchan

发表评论

电子邮件地址不会被公开。 必填项已用*标注