请求
请求对象
1、GenericServlet抽象类中service方法中的 ServletRequest
2、HttpServlet抽象类中 doGet和doPost方法中的HttpServletRequest
请求资源的
请求对象获取路径的方法
//获取虚拟目录
String contextPath = req.getContextPath();
//获取映射路径 就是每一个类对应的映射配置<url-param>里面的路径
String servletPath = req.getServletPath();
// 获取请求者ip地址
String remoteAddr = req.getRemoteAddr();
//获取请求内容
String queryString = req.getQueryString();
//获取uri 就是虚拟路径+资源路径
String requestURI = req.getRequestURI();
//获取url 搜索框输入的路径
StringBuffer requestURL = req.getRequestURL();
请求对象获取请求头的信息
//获取单个值
String date = req.getHeader("Connection");
//其实getHeader也可以获取请求头含多个值的信息 只不过得到的是字符串
//而getHeaders得到的是每一个参数对应的字符串
//获取多个值的
Enumeration<String> date1 = req.getHeaders("name");
//获取所有的头名字
Enumeration<String> headerNames = req.getHeaderNames();
请求对象获取所有参数信息的方法
//获取一个值的表单
String username = req.getParameter("username");
//获取多个值的表单值
String[] loves = req.getParameterValues("love");
//获取所有的名字
Enumeration<String> parameterNames = req.getParameterNames();
//获取所有的键值对
Map<String, String[]> map = req.getParameterMap();
//注意 其中参数是表单里面必填属性name的值
将请求参数封装成对象
1、手动封装
2、反射封装
得到该类的属性描述器 可以得到该类的get和set方法 对应的是writer和reader方法
3、工具类封装对象
a、在WEB-INF下面建一个lib文件夹,导入依赖的包 然后添加操作
b、BeanUtils.populate(对象,map)
//获取键值对集合
Map<String, String[]> map = req.getParameterMap();
//使用无参方法创建对象
Student stu = new Student();
try {
//调用方法封装对象
BeanUtils.populate(stu,map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//底层就是用的反射封装对象的方法
请求流对象
req.getReader():字符流
req.getInputStream():字节流
不支持get方式提交然后创建请求流对象 只支持post方式
请求乱码问题:
首先get方式提交 然后我们获取值是不存在乱码问题的,因为在jdk8别人已经帮我们解决了
post方式提交然后获取值是存在乱码问题的:
解决:req.setCharacterEncoding(”发送页面的编码格式“)
请求域和请求转发和重定向
请求域:就是每一个servlet接受到了请求 他有一个请求域 当请求转发给另外一个servlet,他们是共享请求域的
请求转发就是请请求转发给另外一个servlet
重定向:重新让发起请求者给另外一个指定的servlet对象发起请求
实现请求转发:
req.getRequestDispatcher("/servletdemo9").forward(req,resp);
实现重定向
resp.sendRedirect("/response/ServletDemo3");
两者的区别:
请求转发只请求了一次 而重定向请求了两次
请求转发的两个servlet的请区域是连在一起的,而重定向的请求域不是的,各自各的
请求转发的地址栏不会改变 而重定向的地震了会发生改变
响应对象
1、GenericServlet抽象类中service方法中的 ServletResponse
2、HttpServlet抽象类中 doGet和doPost方法中的HttpServletResponse
给客户端回馈结果的
常见的响应码
200:成功
302:重定向
304:请求资源没有改变,使用缓存
400:一般是请求参数错误
404:一般是请求地址出错
405:请求方式不支持
500:服务器错误
响应流乱码问题
setContentType(“text/html;charset=utf-8”)—设置浏览器响应内容的编码格式
字节流:resp.getOutputStream()
字节流在把字符串使用getBytes()方法是需要指定一个编码格式utf-8;
字符流:resp.getWriter()
实现响应图片
1、创建本地字节读取流
注意:我们把项目的war包发布到tomcat服务器上,对应的图片内容地址需要我们使用getServletContext得到的对象去调用getRealPath获取在war包中的路径 不能使用本地路径
2、创建响应流对象
3、一个读取一个响应给浏览器
4、关闭自己在本地创建的字节读取流 当我们关闭服务器的时候 servlet会被销毁 所以不用我们关闭响应流对象了
设置缓存
当一个内容总是被访问是 我们可以在浏览器上缓存这个数据 提高效率
实现:resp.setDateHeader(“Expires(过期)”,“过期时间”)
小注意点:在搜索框点击刷新是重新请求数据 点回车是访问缓存数据
定时刷新
实现
resp.setHeader("Refresh","3;URL=/response/ServletDemo2");
在过三秒后会调到指定路径
文件下载
1、创建字节响应流对象
2、设置响应头以下载方式响应文件
resp.setHeader("Content-Disposition","attachment;filename=girl.jpg");
// 处理形式 附件形式进行处理 默认下载图片的名称
3、创建本地读取流对象 注意点和响应图片一样
4、一个读取 一个响应到浏览器