A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

webday03_request&response总结
  
   JavaWeb基础都是重点吗?变成鱼的脑子了,学了后面忘了前面。

  案例一从web工程文件夹下读取文件。与传统文件读取不同,web工程发布到Tomcat以后文件结构发生了改变。正确在web工程中读取资源是利用ServletContext里面的两个方法getResourceAsStream(filename)和getRealPath(path)的方法获取资源在tomcat的磁盘绝对路径。两个方法的区别是getResourceAsStream()返回的是字节流对象,getRealPath()返回的是字符串路径。

  第二个案例手动编写一个下载文件的方法。这个案例涉及到的知识很多。
  第一,前端页面的文件连接是用get的方式上传把文件名给Servlet。Servlet接收文件名后,又使用ServletContext获得这个文件的MIME类型,用来给浏览器识别。
  第二,通过ServletContext的getRealPath得到文件的绝对路径。
  第三,设置了两个头:头一"Content-type",后面接一个文件的MIME类型让浏览器识别这个文件类型。头二"Content-Disposition","attachment;url=filename="+filename;告诉要通过下载的方式获得这个文件
  第四,输出文件到用户的浏览器中。使用字节流的形式来操作文件。输入流可以从ServletContext的getResourceAsStream(filename)方法来获得,输出流是response的输出流OutputStream()输出流
  第五,有了输入流和输出流,把输入流转换成文件流。建立一个字节数组byte[1024] ,利用while()循环读到结束。
  第六,解决中文乱码问题。不论是post方法或是get方法传送都会产生中文乱码问题。在参考资料中有服务端的编码问题处理。这里要将的是当把文件传给浏览器的时候, 浏览器也识别不了中文名字文件。要获取浏览器的类型,然后火狐浏览器用Base64编码处理,其他浏览器用URLEnconder编码处理

  总结,这个案例学习了ServletContext里面的两个功能:获取文件的MIME类型;获取文件的绝对路径。

  案例三是写一个注册功能。比较重要的是Servlet->UserService->DAO这三个层次的数据操作。登录成功:设置头"Location"重定向到index.jsp页面;登录失败的话,因为要设置提示信息,所以利用ServletContext的setAttribute()方法把信息设置到里面,前提是,要先在初始化函数init()中先设置一个空的msg。在jsp页面中获取ServletContext的方式是${msg}。
  注册功能是查询数据库有没有存在该实体类,没有存在就表示成功,然后再把这个实体类User插入进去。另外,要把用户昵称,和网站人数传给index.jsp的话,使用域对象ServletContext存取数据。JSP文件再获取。
  
  上面三个案例使用ServletContext域对象的三个功能。ServletContext域对象是服务器在启动的时候,就开辟了一块空间,只要服务器不关闭,这个空间就一直存在,存的数据也可以随时拿来用或者更新。ServletContext有四个功能
1.获取初始化参数。很少用。
2.获取文件的MIME类型
3.获取文件的绝对路径。
4.当作域对象为所有Servlet和JSP共享数据。是重点

   第四学习的是request这个对象。有两个重点,一是request当作域对象存取数据。二是request重定向和转发的区别。
首先request的生命周期是用户请求的时候创建,当响应完毕后结束。重定向是先响应一个空白,再做一次请求,最后响应定位到新的页面,所以是两次请求两次响应,request域对象在重定向中就不起作用了,不要尝试往里面存取数据。转发是request.Redict("servlet的路径"),地址栏不的地址不发生改变。request还存在,可以传数据给新的servlet。


  第五,上自习课学习了Tomcat处理web工程的流程:
   浏览器根据前端传来的地址,首先找到web工程的web.xml配置文件,前端的Servlet虚拟路径/aa,和web.xml中的url-pattern匹配,通过servlet-name找到了要访问的Servlet,其中Tomcat利用反射获取了<servlet-class>Servlet字节码文件。最后把封装的reuqest数据给了Servlet.
回复 使用道具 举报
李思贤:-servletContext对象的四个功能:
    * 1.获得全局初始化参数
    * 2.获得文件的MIME的类型
    * 3.作为域对象存取数据.
    * 4.读取web项目中的文件.

今天上午主要学习了文件下载的功能实现:
首先要学习ServletContext对文件的读取功能:
1getResourceAsStream(String path)  这里根据你提供的路径读取文件返回一个文件的输入流
2getRealPath(String path)  这里返回的是一个路径的磁盘绝对路径

在昨天登录代码的基础上  在登陆成功以后 跳转到一个download的html页面:
一:超链接下载:直接将文件路径写入到超链接的href中--能下载的前提是你用的浏览器不支持该类型文件;
Eg:  <a href="/Day0603/download/123.txt">123.txt</a><br/>
二:手动写入文件下载:需要设置两个头和一个流(在downloadServlet中)
Eg:  <a href="/Day0603/downloadServlet?filename=123.txt">123.txt</a><br/>

下面就是在downloadServlet中的代码实现:
1:接收参数String filename = request.getParameter("filename");
2文件下载(2个头一个流)
* 设置两个头和一个流:
String type = this.getServletContext().getMimeType(filename);
* Content-Type                :文件的MIME的类型.
response.setHeader("Content-Type", type);
* Content-Disposition        :以下载的形式打开文件.
response.setHeader("Content-Disposition", "attachment;filename="+filename);
* InputStream                        :文件的输入流.
String realPath = this.getServletContext().getRealPath("/download/"+filename);


向页面响应方法:
getOutputStream()和getWriter()  这2个方法互斥,用时只能用一种











接下来学习了中文乱码的问题:用渣渣辉的编码处理就行了:
处理编码的时候,先要搞清楚自己是请求乱码 ,还是响应乱码?
要对症下药!!
请求乱码解决 :  get请求:
String str = new String(request.getParameter("name").getBetys("ISO-8859-1"),"UTF-8");
post:request.setCharacterEncoding("utf-8");
响应乱码:        response.setContentType("text/html;charset=utf-8");
把处理乱码的代码写在方法中的靠前的位置


最后就是这用户注册的功能了:
1先要了解request作为域对象存取数据的功能:

使用request对象存取数据:
* setAttribute(String name,String value);
* Object getAttribute(String name);

request的作用范围:
* 作用范围就是一次请求的范围.
* 创建和销毁:
* 创建:客户端向服务器发送了一次请求以后,服务器就会创建一个request的对象.
* 销毁:当服务器对这次请求作出了响应之后.

2重定向和转发的区别(redirect和forward的区别)
* 1.重定向的地址栏会发生变化,转发的地址栏不变.
* 2.重定向两次请求两次响应,转发一次请求一次响应.
* 3.重定向路径需要加工程名,转发的路径不需要加工程名.
* 4.重定向可以跳转到任意网站,转发只能在服务器内部进行转发.


注册案例:分析:
1注册页面提交数据到UserRegistServlet
2接收参数(注意中文乱码问题),封装数据调用UserRegistSerivice中registe方法,在调用UserDao中registe方法,在UserDao中先对该数据检测看数据库中是否含有相同用户名,有就跳转到注册页面(用户名存在//用request域对象存储数据)如果无就跳转到登录页面,登录页面,输入用户名密码,错误就跳转登录页面提示:用户名或密码错误,登陆成功跳转到主页.
回复 使用道具 举报
何平波
使用web工程读取文件,下载文件(使用ServletConText)
1.getResourceAsStream(String path)//相对路径读取文件
2.getRealPath//真实路径读取文件

3.ServletContext(全局参数)功能
功能一:获取全局参数
功能二:获得文件的mime(后缀名)类型 getMimeType
功能三:作为域对象存取对象
存:setAttribute(key,value)
去:getAttribute(key)
功能四:读取web项目下的文件
a1读.ServletContext.getResourceAsStream("/WEB-INF/classes/xx.文件")
a2取.ServletContext.getRealPath("/WEB-INF/classes/xx.文件")


案例一:下载文件
文件下载的方式(设置两个头和一个流)
第一种:超链接下载,直接将文件的路径写到超链接的herf中--前提;文件类型,浏览器不支持
第二种:手动编写代码的方式完成文件的下载
content-type:文件的mime类型
content-Disposition:以下载的形式打开文件
inputStream:文件的输入流

Download?filename=nba.jpg (Download是servlet类的名)



案例二:用户注册页面的功能
步骤
1.创建数据库,创建表
2.准备工作,在WEB-INF文件夹里的lib文件夹引入c3p0,jar  dbutils.jar  jdbc.jar  
3.新建一个Servlet类(自动生成web.xml的url路径),在src路径下引入c3p0-config-xml,再在包下引入一个c3p0的工具类
4.新建一个实体类(实体类中的成员变量和变量名与数据库的类型要一致),新建一个外层业务类service,一个Dao(查询数据库)
5.在WEBContent中引入注册页面,登陆页面的表单提交方式是post,提交路径是(/工程名/url路径)
6.在Servlet类编写注册代码,详见代码编写,可以在Dao类中加一些判断,如果用户名存在的的话就不执行注册
7.执行注册页面,查看注册效果

案例三:用户登陆页面的功能
步骤
1.创建数据库,创建表
2.准备工作,在WEB-INF文件夹里的lib文件夹引入c3p0,jar  dbutils.jar  jdbc.jar  
3.新建一个Servlet类(自动生成web.xml的url路径),在src路径下引入c3p0-config-xml,再在包下引入一个c3p0的工具类
4.新建一个实体类(实体类中的成员变量和变量名与数据库的类型要一致),新建一个外层业务类service,一个Dao(查询数据库)
5.在WEBContent中引入登陆页面,登陆页面的表单提交方式是post,提交路径是(/工程名/url路径)
6.在Servlet类编写登陆代码,详见代码编写
7.执行登陆页面,查看登陆效果
回复 使用道具 举报
林恒山
ServletContext对象读取web项目下的文件:
getResourceAsStream(String path);返回输入流
getRealPath(String path);返回磁盘的绝对路径
注意:两个方法的path参数传入的是项目发布后的位置,不是

在esclise中的位置

ServletContext的功能:
1.读取全局初始化参数:
getInitParameter(String name) 返回web.xml里面的

context-param标签参数是param-name的内容,值为param-

value的内容.
2.获得文件mime类型
getMimeType(String file) 获得文件MIME类型
3.作为域对象存取数据
getAttribute(String name) 读取数据
setAttribute(String name,Object obj) 存入数据
removeAttribute(String name) 移除数据
范围:整个web项目
创建:服务器启动的时候,服务器为每个web项目单独创建一

个ServletContext对象
销毁:服务器关闭或者项目从服务器移除
4.读取web项目下的文件
getResourseAsStream(String path)
getRealPath(String path)

response:响应的对象,从服务器向浏览器输出内容.
响应行:
setStatus(int num)设置状态码

响应头:
一个key对应多个value:
addDateHeader(String name,long date)
addHeader(String name,String value)
addIntHeader(String name,int value)
一个key对应多个value:
setDateHeader(String name,long date)
setHeader(String name,String value)
setIntHeader(String name,int value)

响应体:
getoutputStream()
getWriter()

文件下载的方式:
1.超链接下载,文件路径写到a标签的href.前提,文件类型浏

览器不支持
2.手动编写代码完成文件下载
设置两个头一个流
Content-Type:文件的MIME类型
Content-Disposition:以下载的形式打开文件
InputStream:文件的输入流.

response输出内容是中文乱码的处理:
字节流:
设置浏览器默认打开的编码:resposne.setHeader

("Content-Type","text/html;charset=UTF-8”);
设置中文取出时的编码:"中文".getBytes("UTF-8");

设置浏览器打开的时候的编码
resposne.setHeader("Content-

Type","text/html;charset=UTF-8");
设置response的缓冲区的编码
response.setCharacterEncoding("UTF-8");
简化的写法:response.setContentType

("text/html;charset=UTF-8");

request:用户的请求
功能1.
请求方式:getmethod()
请求的路径:getRequestURI()   getRequestURL()
客户机的ip:getRemoteAddr()
获得工程名:getContextPath()
功能2:
获得页面提交的参数
getParameter(String name)
getParameterMap()
getParamterNames()
getParameterValues(String name)
功能三:作为域对象存取数据
getAttribute(String name) 读取数据
setAttribute(String name,Object obj) 存入数据
removeAttribute(String name) 移除数据

request参数乱码:
post:request.setCharacterEncoding(“UTF-8”);
get:
1.修改tomcat的字符集的编码.(不推荐)
2.使用URLEncoder和URLDecoder进行编码和解码的操作.
3.使用String的构造方法:

request作为域对象存取数据:
作用范围:一次请求的范围
创建:用户向服务器发送一次请求后,服务器就会创建一个

request对象.
销毁:服务器响应之后.

重定向和转发的区别(redirect和forward的区别)
1.重定向的地址栏会发生变化,转发的地址栏不变.
2.重定向两次请求两次响应,转发一次请求一次响应.
3.重定向路径需要加工程名,转发的路径不需要加工程名.
4.重定向可以跳转到任意网站,转发只能在服务器内部进行

转发.

回复 使用道具 举报
15.MIME类型的作用就是通过设置响应头,让浏览器知道我们给它的到底是怎样的文件类型,否则浏览器可能会采用错误的方式进行打开,其实在拿到那个响应头后,浏览器会根据MIME类型选择打开的方式
16.当出现乱码时,需要明确是请求还是响应时的乱码,如果是请求乱码,需要明确是什么类型的请求,
get请求需要调用new String(request.getparameter(“xxx”).getbytes(“ISO-8859-1”),”UTF-8”)
post请求需要调用request.setCharacterEncoding(“UTF-8”)
响应乱码:调用方法,response.setEncoding(“text/html;charset=UTF-8”)
response.setCharacterEncoding(UTF-8)这个方法的设置的是字符流的缓冲区的编码
17. /day01/DownloadServlet?filename=Eclipse.jpg 这个filename其实就是标签中的name属性的值, Eclipse.jpg就是标签中value属性的值
18.request域对象:作用范围:一次请求的范围,也就是说一般是私有的信息才会存到request
                                创建:客户端向服务器发送每一次请求服务器都会创建一个request对象
                                销毁:请求结束
回复 使用道具 举报
邵倩


ServletContext的功能:
一.读取全局初始化参数(了解)

二.(重点)获得文件的MIME的类型

每种文件都有自己的MIME类型
怎么获得:getServletContext().getMimeType("1.html")  //  text/html

三.(完全掌握)作为域对象存取数据:setAttribute(name,value)     getAttribute(name)
范围  整个web项目,而且全局对象
创建  服务器启动时 服务器为每个web项目创建一个单独的ServletContext对象
销毁 服务器关闭时销毁ServletContext

四.(完全掌握)读取web项目下的文件
a.ServletContext.getResourceAsStream(String path) --- 根据提供路径读取文件返回一个文件的输入流.
b.String getRealPath(String path)


案例 登录成功后 用手动编写代码方式完成文件的下载
DownloadServlet:
      接收浏览器请求的文件,
      设置两个头一个流:
          Content-Type   文件的MIME的类型   告诉浏览器响应回来的文件是什么类型
          Content-Disposition    以下载的形式打开文件     告诉浏览器 无论类型 都以下载的形式打开文件
          InputStream   文件的输入流   
      获得response的输出流
      关闭输入流
download.html:  <a href="/day15_pre/DownLoadServlet?filename=hello.txt">hello.txt</a><br/>



responese向页面响应的方法
getOutputStream().write();
getWriter().print();
这两个方法是互斥的,做出响应的时候只能使用其中的一种流响应.

解决乱码问题
先明确是请求乱码还是响应乱码
请求乱码解决 :  get:       String str = new String(request.getParameter("name").getBetys("ISO-8859-1"),"UTF-8");
                        post:     request.setCharacterEncoding("utf-8");
响应乱码: response.setContentType("text/html;charset=utf-8");
把处理乱码的代码写在  方法中的  靠前的位置


Request代表用户的请求
获得客户机信息:
获得请求方式:getMethod()
获得请求路径:getRequestURI()   getRequestURL()
获得客户机IP地址:getRemoteAddr()
*获得工程名:getContextPath()
*getparameter
*作为域对象存取值setAttribute  getAttribute


案例 注册
创建数据库和表 id username password email name sex telephone
创建包和类  实体类  service  dao servlet    网页

Request作为域对象存取数据
使用request对象存取数据
setAttribute()

重定向和转发的区别(redirect和forward)
重定向的地址栏会发生变化,转发的地址栏不变
重定向两次请求 两次响应,转发一次请求一次响应
重定向路径需要加工程名,转发的路径不需要加工程名
重定向可以跳转到任意页面,转发只能跳转工程内的页面
只有转发可以在request域中存数据


回复 使用道具 举报
吴俊斌

掌握response设置响应头
     response.setHeader(name,value);这是针对一个key对应一个value

掌握重定向和转发的区别
    重定向请求两次,响应两次.转发请求一次,请求一次
    重定向的地址栏会发生变化,转发不会;
    重定向可以定向到任意网站,转发只能在服务器内部(当前工程);
    重定向的路径要加上工程名,转发的路径不需要加工程名;
    如果在用request存取数据要用转发



掌握request域的作用范围
    request的域作用范围在响应之前所到的范围
回复 使用道具 举报
123
您需要登录后才可以回帖 登录 | 加入黑马