必须是同一种 若是两种都用要改为false 参数写别的必须写value 不要写成/ 不用idea和iml会重新生成 怎么运行servletdemo 发布目录---重新生成就不会404 下载lombok插件代替getter setter必须先配置
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
然后再搜Annotation processors enable annotation processig 创建实体类---必须序列化如果不序列化就无法缓存
@Data @NoArgsConstructor @AllArgsConstructor @ToString
public class User implements Serializable {
private String address;
private String[] hobby;
}
创建请求参数自动封装beanutils中poulate方法
注意表单name属性必须和实体类名称一致
两个参数第一个封装到哪个对象 req第二个封装的数据是什么resp
<dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.8.3</version> </dependency>
因为一个一个用set获取太麻烦了
所以在变量大的情况下用自动封装
方案一
@WebServlet("/requestDemo2")
public class RequestDemo2 extends HttpServlet {
/**
* 请求消息头获取的相关方法:
* String getHeader(String name)
* 作用;
* 根据消息头名称,获取值。返回的是一个值。
*
* Enumeration<String> getHeaders(String name);
* 作用:
* 根据消息头名称,获取值。返回的是一组值。(消息头值的枚举)
*
* getIntHeader(String name);
* 作用:
* 根据消息头名称,获取消息头的值,转成int类型
*
* getDateHeader(String name);
* 作用:
* 根据消息头名称,获取消息头的值,转成long类型(含义是日期时间的毫秒值)
*
* getHeaderNames()
* 作用:
* 返回消息头名称的枚举
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.根据消息头名称,获取消息头的值
String value = req.getHeader("Connection");
System.out.println("取到的消息头Connection的值是:"+value);
//2.获取所有消息头名称的枚举
Enumeration<String> headerNames = req.getHeaderNames();
//3.遍历枚举
while (headerNames.hasMoreElements()){
//取出消息头
String headerName = headerNames.nextElement();
//根据名称获取值
String headerValue = req.getHeader(headerName);
System.out.println("取到的消息头名称是:"+headerName+",消息头的值是:"+headerValue);
}
}
}
方案二
//1.获取请求的方式: GET和POST 重要
String method = req.getMethod();
System.out.println("请求的方式是:"+method);
//2.获取当前应用发布的名称 非常重要
String path = req.getContextPath();
System.out.println("当前应用的发布名称是:"+path);
//3.获取请求资源的URL
String url = req.getRequestURL().toString();
System.out.println("请求资源URL是:"+url);
//4.获取请求资源URI
String uri = req.getRequestURI();
System.out.println("请求资源URI是:"+uri);
//5.获取使用的协议
String protocol = req.getProtocol();
System.out.println("使用的协议是:"+protocol);
//6.获取来访者信息
String remoteAddr = req.getRemoteAddr();
int remotePort = req.getRemotePort();
System.out.println("获取来访者信息:来访者主机,由于我是自己访问自己,所以主机地址也是自己的电脑地址。"+remoteAddr+",来访者的端口是,每次都是不一样的:"+remotePort);
//7.获取本地信息
String localAddr = req.getLocalAddr();
int localPort = req.getLocalPort();
System.out.println("获取本地信息,就是获取服务器的信息。也是因为只有一台电脑,自己访问自己,所以来访者ip和本地ip是一样的:"+localAddr+",本地端口,指的就是服务器提供的对外访问端口,他是固定的,就是tomcat的端口:"+localPort);`
方案三 用流读取请求正文(请求体) 细节:
-
从服务器对象请求或者响应获取出来的流,都可以不用关闭,服务器会帮我们关闭。
@WebServlet("/requestDemo4")
public class RequestDemo4 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取请求对象的字节输入流
ServletInputStream in = req.getInputStream();
//2.方法一流的操作
// int len = 0;
// byte[] bytes = new byte[1024];
// while((len = in.read(bytes))!=-1){
// System.out.println("用流读取到的请求正文:"+new String(bytes,0,len));
new String(bytes,0,len)从0到len
// }
方法二用包
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.6.4</version> </dependency>
String str = IoUtil.read(in, "UTF-8");
System.out.println("用流读到的请求正文是:"+str);
}
}
方案四共享数据 请求转发
@WebServlet("/requestDemo5")
public class RequestDemo5 extends HttpServlet {
/**
* 获取请求转发对象:
* getRequestDispatcher(转发的目的地)方法
* 参数的写法:
* 写的是请求资源URI。
* 他既支持转发到Servlet,也支持转发到页面(html,jsp都行)
* 细节:
* 转发的目的地只能支持当前应用下的资源,而不能前往应用外部的资源,
* 但是转发的目的地可以是WEB-INF目录(这个目录通过浏览器时不能直接访问的,但是转发可以)
*
* 请求对象的共享区域:
* 在请求对象中,有专门的一块区域可用用于共享数据。
* 共享的数据有使用范围(作用范围):
* 这个范围是,一次请求,或者请求转发中可以使用。
* 使用的方式:
* 存入共享区域
* setAttribute(存入的名称,存入的值)
* 从共享区域取出
* getAttribute(存入时的名称)
* 从共享区域删除
* removeAttribute(存入时的名称)
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//取出借钱的金额
String money = req.getParameter("money");
System.out.println("RequestDemo5接收到了请求,处理不了,转发给了RequestDemo6这个Servlet,"+money);
//转发的数据共享:
req.setAttribute("money",money);
//1.获取转发对象
RequestDispatcher dispatcher = req.getRequestDispatcher("/requestDemo6");//参数写的就是转发的目的地
//2.真正完成转发
dispatcher.forward(req,resp);
}
}
再新建一个类
/**
- 请求转发
-
转发的目的地
*/ @WebServlet("/requestDemo6") public class RequestDemo6 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.从共享区域中取出金额
String money =(String) req.getAttribute("money");
System.out.println("RequestDemo6接收到了5的转发,给钱"+money);
}
}