本帖最后由 奔跑的蜗牛006 于 2018-5-21 15:23 编辑
Request和Response
两种方式读取web工程下的文件:软件里项目工程中的src就变成了D盘(Tomcat)WEB-INF中的classes文件夹 软件里WebContent这个工程名就相当于D盘里工程名; ServletContext代表整个web项目,它=web-content所以它与WEB-INF同级; 传统方式:
//创建servlet类
//FileInputStream路径
//创建properties对象
//load()
//properties.getProperty()
相对路径不妙必须在创建的servlet类使用ServletContext对象,普通类不行
ServletContext:
方法一:inputStream getResourceAsStream()
//创建SrevletContext对象
方法二:context.getrealPath();获得磁盘绝对路径
总结ServletContext功能:四个
读取全局初始化参数:
//web.xml(修改添加)
//<context-param>
//所有Servlet类都可以获得到
获得文件的MIME类型:
//String this.getServletContext.getMimeType("1.html)
作为域对象存储数据:
//范围:整个web项目,而且全局的对象,都可以获得到;
读取web项目下的文件:
类加载器---读取文件(企业级工具类)
//在普通class类中,使用类加载器读取文件(前提没有Servlet类)
//类的加载器用来加载class文件,把class文件加载到内存;
//InputStream=类名.class.getClassLoader().getRresourceAsStream("db.properties");
文件下载:(Response响应) 1.超链接方式:如果浏览器支持的话,就只能打开.不能下载; 2.手动编码方式下载(创建Servlet类)
文件下载的核心思想:
从服务器io读取,写到客户端;
InputStream in=new FileInputStream("服务器上的路径")
OutputStream os=response.getOutputStream();
读: int len;
byte[] b=new byte[1024];
while((len=is.read(b))!=-1){
os.write(b,0,len);
}
is.close();
Response:(API)
//HttpServletResponse,ServletResponse
文件下载步骤:
//新建Servlet类,设置两个头一个流
//接收参数
//设置Content-Type头
//设置Content-Disposition头
//设置文件的InputStream.
//获得response的输出流
中文文件的下载:
//接收数据
//设置Content-Type头
//设置文件的InputStream
//根据浏览器类型处理中文文件的乱码问题
//设置Content-Disposition头
//获得response的输出流
response输出响应内容的方法:
向页面输出的两种方式:
字节流(不一定乱码,看浏览器)
response.getOutputStream().writte("hello".getBytes())
字符流(一定乱码,有缓冲区)
getWriter().print("中文");
这两个方法互斥,只能使用其中一个;
解决字符流中文乱码:response.setContentType("text/html;charset=UTF-8");
用户注册的功能:
页面信息保存到数据库;
Servlet的API: ServletRequest,
客户端信息(request):
获得请求的方式: getMethod()
获得请求的路径: getRequestURL()
获得ip: getRemoteAddr()
获得工程名: getContextPath()
获得表单数据: String getParameter(String name)
(post) String[] getParameterValues(String name)
Map<String,String[]> getParameterMap()
域对象: setAttribute(String name,String value)
getAttribute(String name)
removeAttribute()
注册准备工作:
//创建数据库和表
//创建包和类(Servelt,Service,Dao)重写构造(this)方法的时候记得添加无参构造; 表单的提交方式是:post
POST中文乱码:request.setCharacterEncoding("UTF-8");数据库显示防止乱码
GET中文乱码:new String(request.getParameter("filename").getBytes("ISO-8859-1"),"UTF-8");
//接收参数(try,catch)
request.getParameter("username");
//封装数据
user.setUsername(username)
//调用业务层处理数据
userService.regist(user);
//页面跳转
response.sendRedirect("路径")
处理request接收参数的中文乱码的问题:
POST和GET提交中文的时候都会出现乱码的问题;
POST解决:request.setCharacterEncoding("UTF-8");在接受参数之前
GET解决:
参考String的构造方法--
String name=new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
分开写:
String name=requset.getParameter("name");
String name=new String(name.getBytes("ISO--8859-1"),"UTF-8");
Request作为域对象存取数据:
使用request对象存储数据:
setAttribute(String name, String value);
Object getAttribute(String name);
request的作用范围:
作用范围就是一次请求的范围
创建:客户端向服务器发送了一次请求以后,服务器会创建一个request的对象.
销毁:当服务器对这次请求作出了响应之后.
重定向和转发的区别:(redirect和forward区别)重定向:
地址栏发生变化(重新发起第二次请求),两次请求,两次响应;路径带工程名;可以跳转任意网址;存的数据在第一次请求销毁后结束;
response.sendRedirect("/day10/")response.sendRedirect("带工程名称的路径")
转发:
地址栏没变化,一次请求,一次响应;路径不需要带工程名;只能在工程内跳转;request域中存的数据能转到另一个类(页面);
request.getRequestDispatcher("不带工程名的路径").forward(request,response)
|