笔记内容的发布主要是怕哪天自己的电脑挂了 之前总结的笔记会丢,所以在这个网站晒出来作为备份,笔记的内容也是自己对此技术的粗浅理解,仅供自己观看,并不能保证全部理解都是正确,还需网友观看时自行鉴别 谢谢
Request:
request对象和response对象的原理
request和response对象是由服务器创建的。我们来使用它们
request
对象是来获取请求消息
我的简单的理解:request 就是浏览器向服务器发出请求,这里面包括用户填写的一些信息数据,然后服务器通过request来获取这些数据,然后通过request的一些方法来处理我们想得到的东西。
`浏览器————>服务器`
response
对象是来设置响应消息
我的理解就是它是来反回给浏览器消息的
`服务器————>浏览器`
Request功能:
-
获取请求消息数据
获取请求行:GET /day14/demo1?name=zhangsan HTTP/1.1下面 方法2 和5 的方法重点掌握
- 获取请求方式 :GET
String getMethod()
- 获取虚拟目录(重要掌握):/day14
String getContextPath()
- 获取Servlet路径: /demo1
String getServletPath()
- 获取get方式请求参数:name=zhangsan
String getQueryString()
- 获取请求URI(重要掌握):/day14/demo1
String getRequestURI(): /day14/demo1
StringBuffer getRequestURL() http: / /localhost/day14/demo1 - 获取协议及版本:HTTP/1.1
String getProtocol()
- 获取客户机的IP地址:
String getRemoteAddr()
- 获取请求方式 :GET
URL:统一资源定位符 : http://localhost/day14/demo1
URI:统一资源标识符 : /day14/demo1 (这个大)
这两个相比 URI>URL 就像 共和国(URI)要比 中华人民共和国(URL)大是一个道理
获取协议及版本:HTTP/1.1 String getProtocol()
获取客户机的IP地址:String getRemoteAddr()
@WebServlet("/RequestDemo1") //这里千万注意默认是name 把它删了
public class RequestDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求方式:
String method = request.getMethod();
System.out.println(method);
//2. 获取虚拟目录(重要掌握)
String contextPath = request.getContextPath();
System.out.println(contextPath);
//3.获取Servlet路径
String servletPath = request.getServletPath();
System.out.println(servletPath);
//4.获取get方式请求参数
String queryString = request.getQueryString();
System.out.println(queryString);
//5.获取请求URI(重要掌握)
String requestURI = request.getRequestURI();
System.out.println(requestURI);
StringBuffer requestURL = request.getRequestURL();
System.out.println(requestURL);
//6. 获取协议及版本
String protocol = request.getProtocol();
System.out.println(protocol);
//7. 获取客户机的IP地址:
String remoteAddr = request.getRemoteAddr();
System.out.println(remoteAddr);
}
}
Connected to server
[2016-01-18 03:18:15,963] Artifact ServletDemo2:war exploded: Artifact is being deployed, please wait...
[2016-01-18 03:18:16,323] Artifact ServletDemo2:war exploded: Artifact is deployed successfully
[2016-01-18 03:18:16,323] Artifact ServletDemo2:war exploded: Deploy took 360 milliseconds
GET
/day14
/RequestDemo1
null
/day14/RequestDemo1
http://localhost:8080/day14/RequestDemo1
HTTP/1.1
0:0:0:0:0:0:0:1
获取请求体数据:
请求体:只有post请求方式 才有请求体,在请求体中封装post请求的请求参数
步骤:
1 获取流对象
BufferedReader getReader()
:获取字符输入流,只能操作字符数据
ServletInputStream getInputStream()
:获取字节输入流,可以操作所有类型数据
2 从流对象中拿数据
2 其他功能:
1. 获取请求参数通用方式:
不论get还是post请求方式都可以使用下列方法来获取请求参数
XXX.getParameter(String name).var
:(常用) 根据传递的参数名称获取对应的参数值
比如在 username= zs & password= 123 中
往(String name)这里传递了username 它就给返回一个字符串zs
往(String name)这里传递了password 它就给返回一个字符串123
XXX.getParameterValues(要查询的键).var
:根据传递的参数名称获取名称下所有的参数 打包成的数组
比如:hobby=xx&hobby=game 这两个的键是一样的 但是传递的值是不同的
所以用这个方法可以传递一个hobby的数组存储着两个元素
Enumeration<String> getParameterNames()
:获取所有请求的参数名称
XXX.getParameterNames().var
:获取所有请求的参数名称
和获取请求头的方法差不多 代码如下:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取所有请求的参数名称
//获取请球头名称 放在枚举这个集合里
Enumeration<String> parameterNames = request.getParameterNames();
//然后拿着这个对象遍历他们
while (parameterNames.hasMoreElements()){
//根据名称获取请求体的值
String name = parameterNames.nextElement();
//打印出来
System.out.println(name);
//根据name获取name下的值命名为value
String value = request.getParameter(name);
System.out.println(value);
//每输出一个键值对就用-----分隔
System.out.println("-------------");
}
Map<String,String[]> getParameterMap()
:获取所有参数的map集合
XXX.getParameterMap().var
:(常用)获取所有参数的map集合
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取所有的参数map集合
Map<String, String[]> parameterMap = request.getParameterMap();
//遍历
Set<String> keySet = parameterMap.keySet();
for (String name : keySet) {
//根据键获取值
String[] values = parameterMap.get(name);
System.out.println(name);
for (String value : values) {
System.out.println(value);
}
//每循环一次用——————分隔
System.out.println("______");
}
中文乱码问题:
get方式:tomcat 8 已经将get方式乱码问题解决了
post方式:会乱码
解决:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
}
2.获取请求头数据
String getHeader(String name)
: 通过请求头的名称获取请求头的值(重点掌握)
Enumeration<String> getHeaderNames()
: 获取所有的请求头名称
第一种:获取全部请求头名称
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1 获取请求头数据
//2 获取请球头名称
Enumeration<String> headerNames = request.getHeaderNames();
//3 遍历
while (headerNames.hasMoreElements()){
String name = headerNames.nextElement();
//根据名称获取请求头的值
String value = request.getHeader(name);
System.out.println(name+"+"+value);
}
}
第二种:通过请求头名称获取请求头的值
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//演示 获取请求头数据:user-agent
String agent = request.getHeader("user-agent");
System.out.println(agent);
--------------------
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
请求转发
一种在服务器内部进行资源跳转方式
1. 步骤:
- 通过request对象获取请求转发器对象:
RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher对象来进行转发:
forward(ServletRequest request, ServletResponse response)
一般使用链式编程:
request.getRequestDispatcher("/要转发的路径").forward(request,response);
例题:从sDemo2转发到sDemo3
sDemo2代码
@WebServlet("/sDemo2")
public class ServletDemo2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
System.out.println("sdemo2被访问了");
request.getRequestDispatcher("/sdemo3").forward(request,response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
sDemo3代码
@WebServlet("/sdemo3")
public class ServletDemo3 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("sdemo3被访问了");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
2 转发特点:
- 浏览器地址栏路径不发生变化
- 只能转发到当前服务器内部资源中。
- 转发是一次请求
3 共享数据
域对象:一个有作用范围的对象,可以在一定范围内共享的数据
request域:代表依次请求的范围,一般用于请求转发的多个资源中共享数据
- 方法:
void setAttribute(String name,Object obj)
:存储数据Object getAttitude(String name)
:通过键获取值void removeAttribute(String name)
:通过键移除键值对
4 获取ServletContext
ServletContext getServletContext()
login.html
中form表单的action路径的写法 虚拟目录+Servlet的资源路径
BeanUtils工具类:
简化数据封装 简单的说它是用于封装JavaBean的
1. JavaBean:标准的Java类
要求:
1 必须被public修饰
2 必须提供空参的构造器
3 成员变量必须使用private修饰
4 提供公共的setter和getter方法
成员变量 和属性:
public class User {
private String username; ---->这里的username是成员变量
public String getUsername() { ---->这里的username是属性(U转换成小写)
return username;
}
大多数的时候 成员变量和属性是一样的 但是也有不一样的时候 这个需要注意
- 方法:
setProperty()
: 设置属性 赋值 BeanUtils.setProperty(空容器对象,“要赋予值的对象名”,“要赋予的值”)getProperty()
: 获取属性 获取值 BeanUtils.getProperty(空容器对象,“要获取的值”)populate(Object obj , Map map)
: 封装JavaBean的方法 将map集合的键值对信息,封装到对应的JavaBean对象中
批量获取参数,一次性把数据封装成一个对象,简化封装
1.导入commons-beanutils-1.8.0.jar包
2. request对象使用getParameterMap返回一个map类型的值,这个返回值是全部的前端参数,但是这个map集合不能修改只能读,所以需要新建一个map对象来接收方便日后修改。
3. 新建一个空的user对象
4. 使用位于org.apache.commons.beanutils.BeanUtils下面的BeanUtils.populate(第三步获得的空容器,打包数据的map集合),括号里面传递获取的容器和map集合
5. 有异常 抓一下
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1设置编码
req.setCharacterEncoding("utf-8");
//1 获取全部请求参数
Map<String, String[]> map = req.getParameterMap();
//2 创建一个空的user对象
User loginuser = new User();
//3 使用BeanUtils封装
try {
BeanUtils.populate(loginuser,map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
重点API
// 获取请求方式
req.getMethod();
// 获取工程名
req.getContextPath();
// 获取URL
req.getRequestURL();
// 获取IP
req.getRemoteAddr();
// 获取请求头
req.getHeader("use-agent");
// 获取请求参数
req.getParameter("username");
req.getParameterValues("hobby");
req.getParameterMap();
// 解决post请求的中文乱码
req.setCharacterEncoding("utf-8");
// 封装Javabean
BeanUtils.populate(user,map);
// 操作域对象
req.setAttribute();
req.getAttribute();
// 转发
req.getRequestDispatcher().forward();
~~~
```java
ctrl+Ait+T 在IDEA中能召唤出很多方法