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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

同学们,今天我们学习了request和response,在JavaWeb阶段几乎每天我们都要和这两个对象打交道。

今日需要掌握的有:
  • 掌握response设置响应头
  • 掌握重定向和转发的区别
  • 掌握request接收请求参数
  • 掌握request域的作用范围

请同学们按照如上要求,总结今日所学。




50 个回复

正序浏览
请求req——ServletRequest接口   
{
    获得与客户机相关的信息
    获取页面提交的数据
    作为域对象存取数据
    {
        作用范围:一次请求的范围
        创建:客户端发送一次请求,服务器会创建一个request对象
        销毁:当服务器对这次请求作出响应后
        相关API
        {
            Object getAttribute(String name)
            void setAttribute(String name, Object o)
            void removeAttribute(String name)
        }
    }
}

响应res——ServletResponse接口
{
    处理响应体
    {
        相关API
        {
            字节流:ServletOutputStream getOutputStream()
            字符流:PrintWriter getWriter()
        }
        注意
        {
            响应式要么字符流要么字节流,不能两者一起用
        }
    }
   
    处理响应头
    {
        add系列相关API:针对一个key对应多个value头
        {
            void addDateHeader(String name, long date)
            void addHeader(String name, String value)
            void addIntHeader(String name, int value)
        }
        set系列相关API:针对一个key对应一个value头
        {
            void setDateHeader(String name, long date)
            void setHeader(String name, String value)
            void setIntHeader(String name, int value)
        }
    }
   
    子接口HttpServletResponse
    {
        setStatus(int sc)
        {
            状态码
            200成功
            302重定向
            304查找本地缓存
            404访问资源不存在
            500服务器内部错误
        }
    }
}


处理中文乱码问题
{
    响应
    {
        字节流输出
        {
            1.设置浏览器打开时默认采用的字符集编码---(Response对象).setHeader("Content-Type","text/html;charset=UTF-8")
            2.设置中文字节取出时候的编码---(Response对象).getOutputStream.writer("中文".getBytes("UTF-8"))
        }
        字符流输出
        {
            概述:Response对象使用的字符流有缓冲区,默认编码ISO-8859-1,编码根本不支持中文
            方法一
            {
                1.设置Response对象的字符流的缓冲区的编码---(Response对象).setCharacterEncoding("UTF-8");
                2.设置浏览器打开时默认采用的字符集编码---(Response对象).setHeader("Content-Type","text/html;charset=UTF-8")
            }
            方法二
            {
                一键设置(Response对象).setContentType("text/html;charset=UTF-8")
            }
        }
    }
   
    请求
    {
        概述:Request对象有一个缓冲区.request的缓冲区也是ISO-8859-1编码
        
        POST方式
        {
            设置Request对象的缓冲区的编码---(Request对象).setCharacterEncoding("UTF-8");
        }   
        
        GET方式
        {
            使用String(byte[] bytes,String charsetName)
            举例:String str = new String(request.getParameter("name").getBetys("ISO-8859-1"),"UTF-8");
        }
    }
}
            
               
转发和重定向
{
    重定向redirect
    {   
        概述
        {   
            两次请求,两次响应
            地址栏改变
            路径仍然是客户端到服务器,需要带工程名
            可以跳转到任意网站
        }
        一键设置(HttpServletResponse对象).sendRedirect("/MyWeb/fathersday/Title.html")
    }
   
    转发forward
    {   
        概述
        {
            一次请求,一次响应
            地址栏不变
            路径是服务器到服务器,不需要带工程名
            只能在服务器内部进行转发
        }
        (ServletRequest对象).getRequestDispatcher(String path).forward(ServletRequest request, ServletResponse response)
    }
}

读取文件
{
    相关API
    {
        InputStream getResourceAsStream(String path)  根路径为(MyWeb)/
        String getRealPath(String path) 获取磁盘绝对路径
    }
   
    注意
    {
        Tomcat加载Web项目后,实际上是将WebContent文件夹重命名为Web项目名称后,
        放到Tomcat根目录下的webapps文件夹下,此时Java Resources的scr路径变成了WEB-INF/classes
    }
}

文件下载
{
    超链接下载
    {
        方法:直接将路径写到href中
        前提:文件类型浏览器不支持打开
    }
        
    手动编写代码方式完成下载
    {
        1.获得文件的MIME类型---String getMimeType(String file)
        2.设置两个头一个流
        {
            (Response对象).setHeader("Content-Type", TypeName)---告诉浏览器以下载的形式打开文件
            (Response对象).setHeader("Content-Disposition", "attachment;filename="+filename);
            InputStream getResourceAsStream(String path)---设置文件输入流,将Web项目文件变成输入流
        }
        3.然后用outputStream输出
        {
            (Response对象).getOutputStream()
        }
}

回复 使用道具 举报
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.
回复 使用道具 举报
吴俊斌

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

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


回复 使用道具 举报
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对象读取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.重定向可以跳转到任意网站,转发只能在服务器内部进行

转发.

回复 使用道具 举报
何平波
使用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对象的四个功能:
    * 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域对象存储数据)如果无就跳转到登录页面,登录页面,输入用户名密码,错误就跳转登录页面提示:用户名或密码错误,登陆成功跳转到主页.
回复 使用道具 举报
Do1 中级黑马 2018-6-4 22:09:12
40#
本帖最后由 Do1 于 2019-11-23 00:37 编辑


学习了request和response,很不错挺好用
回复 使用道具 举报
郑学馨
案例一:完成文件的下载
步骤:第一:创建下载的servlet类
     第二:获得传输的参数(也就是文件名)
     第三:根据传输的文件名调用contextservlet中的getmimetype()方法获取文件的Mime类型
     第四:设置文件类型:(设置响应头:response.setheader("content-type",mime类型));
     第五:设置文件名与下载文件开关(设置响应头:response.setheader("content-disposition","attachment;filename"+文

件名))
     第六:获得文件的下载的绝对路径:(this.getservletcontext().getrealpath("/文件所在文件夹名/"+文件名))
     第七:利用文件输入流读取文件(new fileinputstream(绝对路径));
     第八:利用response调用其中的getoutputstream()方法下载文件
     第九:文件流的写入方式:int len = 0;
                        byte[] b = new byte[1024];
                        while ((len = fs.read(b)) != -1) {
                        os.write(b, 0, len);
                        }
                        fs.close();

案例二:完成用户注册:
步骤:第一:创建数据库;
     第二:创建表信息
     第三:创建相对应的javabean
     第四:创建servlet类
        4.1:接收客户端传输的注册信息
        4.2:创建javabean对象
        4.3:将客户信息封装到对象中
        4.4:创建service(业务类)
                4.4.1:调用service类中的注册功能
                4.4.2:创建数据库操作类(userdao)
                        4.4.2.1:查询数据库中的数据,是否存在该用户名
                        4.4.2.2:不存在则向数据库中添加该对象
                        4.4.2.3:返回查询结果
     第五:根据返回的值判断是否存在,如果存在用户名,响应"用户名已存在",如果不存在,响应"注册成功"

servlet中的域对象:
1:request:请求域对象;一个用户可以有多个,存储的数据在进行响应后就销毁了,生命周期较短
2:servletcontext:项目域对象,所有用户共用这一个,存储的数据全局都可以调用,只有在服务器停止或者项目移除后销毁
3:session:一个用户只有一个
回复 使用道具 举报
康元中
学习两个域对象ServeletContext和request
域对象是一个地方存数据一个地方取数据
1 ServletContext这个域对象 作用范围最大;在工程的任何位置都可以获取ServletContext中的数据
   ServletContext 创建时间:在tomcat第一次启动时创建
   ServletContext 销毁时间:在tomcat关闭或者移除项目时关闭
   在jsp中写代码可以用<%代码%>
2 request 是Servlet中的请求对象
   request 创建的时间:在浏览器发送请求
           结束的时间是在一次请求一次响应完
3 request的重定向和转发
   重定向是:resp.sendRedirect()   转发 request.getRequestDispatcher(路径).forward(request, response)
   两次请求和响应         是一次请求一次响应
   地址栏路径会改变       地址栏路径不发生该变
  路径要加上工程名        路径不用加工程名
request域对象存取的值在转发中是有效的,在重定向无效的.

4 Servlet
        Servlet生命周期:Servlet从创建到销毁的过程.
        何时创建:用户第一次访问Servlet创建Servlet的实例
        何时销毁:当项目从服务器中移除的时候,或者关闭服务器的时候.
用户第一次访问Servlet的时候,服务器会创建一个Servlet的实例,
那么Servlet中init方法就会执行.任何一次请求服务器都会创建一个新的线程访问Servlet中的service的方法
.在service方法内部根据请求的方式的不同调用doXXX的方法.(get请求调用doGet,post请求调用doPost).
当Servlet中服务器中移除掉,或者关闭服务器,Servlet的实例就会被销毁,那么destroy方法就会执
5 **登录注册案例的完成
  6 文件的下载使用三个步骤: 设置两个响应头和一个响应到浏览器页面的文件输出流和输入流对接
   处理响应的中文乱码问题 :他分成了字符流 方式和字节流方式

  
回复 使用道具 举报
凌辉:
向页面响应的方法:
getOutputStream();
getWriter();

* 这两个方法是互斥的.
    * 做出响应的时候只能使用其中的一种流响应.
使用request对象存取数据:
setAttribute(String name,String value);
Object getAttribute(String name);

request的作用范围:
作用范围就是一次请求的范围.
*创建和销毁:
     创建:客户端向服务器发送了一次请求以后,服务器就会创建一个request的对象.
     销毁:当服务器对这次请求作出了响应之后.
1.重定向的地址栏会发生变化,转发的地址栏不变.
2.重定向两次请求两次响应,转发一次请求一次响应.
3.重定向路径需要加工程名,转发的路径不需要加工程名.
4.重定向可以跳转到任意网站,转发只能在服务器内部进行转发.
回复 使用道具 举报
16weisong今天学习了request和response的对象的,这两个都是域对象,今天主要掌握2个案例即可:1.用户注册  2文件下载,只需把这两个案例给敲了即可掌握
回复 使用道具 举报
叶身辉:


域对象:  可以存取数据.一个地方保存,另一个地方取出,  不同:生命周期和作用返回.
       
        ServletContext创建: 服务器启动,服务器会为我们每一个工程创建一个属于他们自己的ServletContext,在该工程的任意位置都可以获取ServletContext中的数据;
        ServletContext销毁, 服务器关闭或者项目从服务器中移除,销毁ServletContext.

        * ServletContext对象:(重要)-被多个用户共享.
    * 记录网站被登录的次数.
    * 在服务器启动的时候ServletContext就会被创建.一个WEB项目创建一个ServletContext对象.
在服务器关闭的时候销毁.域对象-存的数据有作用范围.
    * 功能:
        * 1.获得文件的MIME的类型.
        * 2.获得全局初始化参数.
        * 3.存取数据-作为域对象来使用.
            * setAttribute(String name,String value);
            * getAttribute(String name);
            * removeAttribute(String name);
        * 4.读取WEB项目的文件:
            * getResourceAsStream(String path);
            * getRealPath(String path);
       
       

        request创建:发送请求;
        request销毁:响应结束;
                *访问Servlet会不会创建request   会
                *访问JSP会不会创建request                会
                *访问HTML会不会创建request                会
               
        request:  
                        获得客户机信息:
                        getMethod();                        ---获得请求方式.
                        getQueryString();                ---获得请求路径后的参数.
                        getRemoteAddr();                ---获得客户机的IP地址.
                        getRequestURI();                ---获得请求的路径
                        getRequestURL();                ---获得请求的路径
                        getContextPath();                ---获得工程名
                        获得请求头
                        getDateHeader();
                        getHeader();
                        getHeaderNames();
                        getHeaders();
                        getIntHeader();
                        * request.getHeader(“User-Agent”);
                        * request.getHeader(“Referer”);
                        请求参数:
                        getParameter();   
                        getParameterMap();
                        getParameterNames();
                        getParameterValues();
                        用来作为域对象存取值:
                        removeAttribute();
                        setAttribute();
                        getAttribute();
                       
                       
        Response对象
                响应行:
                        Response设置状态码:
                        setStatus();
               
                响应头:
                * 一个key对应一个value
                setDateHeader();
                setHeader();
                setIntHeader();
                * 一个key对应多个value
                addDateHeader();
                addHeader();
                addIntHeader();
                响应体:
                getOutputStream();
                getWriter();
               
解决中文乱码问题
请求乱码解决 :  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");
                       
                       
文件下载:
                手动编码方式完成文件下载.
                        * 设置两个头和一个流:
                        * Content-Type:文件MIME的类型.
                        * Content-Dispostion:
                        * 文件的输入流:
                       
               
        session
        session       
               
               
域对象中的方法:
        setAttribute();
        getAttribute();
       
【重定向】
response.sendRedirect(String path); -- 完成重定向
【转发】
request.getRequestDispatcher(String path).forward(request,response);
【区别】
1.转发的地址栏不变的.重定向的地址栏发生变化的.
2.转发是一次请求一次响应,重定向是两次请求两次响应.
3.request域对象存取的值在转发中是有效的,在重定向无效的.
4.转发的路径不需要加工程名.重定向的路径需要加工程名.
回复 使用道具 举报
郑志祥


用户注册的操作
1.创建User表(在数据库创建)
2.创建User实体类
3.导入3个包C3P0         mysql  DButils
4.创建userDao表(执行sql语句,增删改查)
5.创建UserServlce(业务层,创建UserDao对象,使用UserDao里面的方法)
6.创建UserSevlet  (1,解决乱码问题 2.接收数据 3.将数据封装到user对象中  4.调用业务-->userDao执行sql语句  -->跳转页面    转发跳转与重定向跳转)
转发跳转
request.getRequestDispatcher(路径).forward(request, response);
重定向跳转
response.sendRedirect("demo1-download/success.html");
7.Servlet的生命周期  (重点)
              生命周期:一个对象从创建到销毁的过程
        Servlet生命周期:从创建到销毁的过程
                创建时间: 客户第一次访问Servlet时创建Servlet实例(只创建一次)
                销毁时间: 当项目从服务器中移除的时候,或者关闭服务器的时候
解决乱码问题
请求乱码解决 :
get:
Stringstr=newString(request.getParameter("name").getBetys("ISO-8859-1"),"UTF-8");

post:    
request.setCharacterEncoding("utf-8");

响应乱码:        response.setContentType("text/html;charset=utf-8");

下载的操作步骤
1.接收数据
2.完成文件的下载
2.1设置Content-Type头
2.2设置Content-Disposition头   
2.3设置文件的InputStream.
回复 使用道具 举报
黄进安:

1.      读取WEB工程下的文件
l  使用ServletContext对象,调用getResourceAsStream(Stringpath);根据提供路径读取文件返回一个文件的输入流,在调用properties对象的方法load(获得的输入流) 从输入流中读取属性列表(键和元素对),在调用properties对象的getProperty(String key)用指定的键在此属性列表中搜索属性
l  使用ServletContext对象, getRealPath(Stringpath); 返回一个路径的磁盘绝对路径.在根据路径获得文件输入流,其余同上
2.      ServletContext的作用
l  读取全局初始化参数.
l  获得文件的MIME的类型.
l  作为域对象存取数据.
l  读取web项目下的文件
3.      文件下载案例
在下载页面的HTML文件中,下载的超链接如下
<a href="/webdemo03/ServletDown?filename=hello.jnt">hello.jnt</a>
l  ?之后的红色部分相当于点超链接之后,将红色部分的键值对信息请求到浏览器根据指定的url访问web.xml配置文件中对应的.class对象,此class对象继承了HttpServlet类就可以根据请求方式调用server方法,处理浏览器的请求和给予浏览器的响应
l  在servlet对文件进行下载操作步骤:
1)        获得请求参数: eg. request.getParameter("filename");--->得到值(文件名)
2)        获得文件类型: getServletContext().getMimeType(文件名);--->type
3)        设置Content-Type头: response.setHeader("Content-Type", type);
4)        设置Content-Disposition头: response.setHeader("Content-Disposition","attachment;filename="+filename);
5)        获得文件的输入流:InputStream.(ServletContext的两种方法获取)
6)        获得response的输出流: response.getOutputStream();
7)        利用输入流读取文件,利用响应输出流输出文件
4.      注册页面案例
l  跟昨天的登入案例差不多,只要在添加用户信息之前对用户名进行判断是否已经存在数据库即可
l  存在时:
1)        调用request对象的setAttribute(String name,String value);用来存储对jsp页面中的信息,eg: 用户名已存在
2)        利用转发返回注册页面重新注册(路径相对于服务器而言,可以不写项目名)
request.getRequestDispatcher("/demo02/regist.jsp").forward(req,resp);
用户名可用时:
1)        往数据库插入用户注册的相关信息即可
2)        利用重定向到登入页面
response.sendRedirect("/webdemo03/demo02/enter.jsp");


回复 使用道具 举报
张裕
                                        Request与Response
Web项目读取文件要用绝对路径

ServletContext对象读取WEB项目下的文件
        getResourceAsStream(String path)        根据提供的路径读取文件返回字节输入流对象
        getRealPath(String path)                  返回路径的绝对路径(磁盘中的全路径)

        获取了ServletContext对象时相当于已经进入了项目路径里 已经不需要在路径名里加项目名了

功能:
        1 读取全局初始化参数
                getInitParameter(String name) 根据属性名获取值
                getInitParameterNames() 获取初始化参数的所有属性名

        2 获取文件的MIME类型
                getMimeType(String file) 获得文件MIME类型

        3 作为域对象来存储数据!
                范围:整个web项目 是全局的对象
                创建:服务器启动的时候,会为每个web项目创建一个单独的ServletContext对象
                销毁:服务器关闭的时候

        4 读取web项目下的文件!
                工具类 类加载器:加载class文件到内存中
                        类名.class.getClassLoader().getResourceAsStream("文件路径"); 返回字节输入流


                                        文件下载
Response概述
        响应对象,从服务器向浏览器输出内容

常用API
        setStatus 设置状态码
        setHeader... 设置响应头 查api
                设置响应体 查api

文件下载的方式
        1 超链接下载
                直接将文件路径写在超链接的href中 前提: 文件类型浏览器不支持  支持的话文件将直接打开
        2 手动编写代码
                设置两个头和一个流
                        Content-Type:文件的MIME的类型
                        Content-Disposition:以下载的形式打开文件
                        InputStream:文件输入流
       
操作步骤
        1 获取文件名
        2 获取文件类型
        3 设置type头
        4 设置Disposition头
        5 获取输入 输出流
                       

中文文件下载乱码解决
        请求乱码解决方式 new String(文件名.getbytes("ISO-8859-1"),"utf-8")
        响应乱码解决 URLEncoder.encode(文件名,编码类型)

response输出响应的方法
        1 getOutputStream()
        2 getWriter()
这两个方法是互斥的(只能使用其中一种流)

输出中文乱码的处理:
        字节流:
                设置浏览器默认打开的编码:
                        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 获取客户机的相关信息
        2 获取从页面中提交的参数
        3 作为域对象存储数据

request接收参数中文乱码的解决方法
        POST的解决方案:
                POST的参数是在请求体中,直接到达后台的Servlet.
                数据封装到Servlet中的request中.request有一个缓冲区 编码类型为ISO-8859-1
        设置request的缓冲区的编码:
                request.setCharacterEncoding(“UTF-8”);  一定要在接收参数之前设置编码

        GET的解决方案:
                1.修改tomcat的字符集的编码.(不推荐)
                2.使用URLEncoder和URLDecoder进行编码和解码的操作.
                3.使用String的构造方法:
                                new String()
Request作为域对象存取数据
        使用request对象存取数据:
                setAttribute(String name,String value);
                Object getAttribute(String name);

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


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

重定向
        request.sendRedirect("路径");
转发
        request.getRequestDispatcher("路径").forwar(request,response);
回复 使用道具 举报
万冕

今天主要学习注册页面的构建,就包含了所有三合一


手动编码下载
     设置两个头和一个流:

     Content-Type:文件MIME的类型.
     Content-Dispostion:把类型全改为下载模式
     inputStream: 文件输入流(下载就是下载这个)

解决编码问题,有神奇的解决编码.txt

重定向和转发

重定向
response.sendRedirect(String path);

1.地址栏会发生改变
2.两次请求两次回应
3.域对象的生命周期存取值无效

转发
request.getRequestDispatcher(String path).forward(request,response);

1.地址栏不会发生改变
2.一次请求一次回应
3.可以在域对象内存取值


request的域对象存取值用处可以输出错误信息
回复 使用道具 举报
许剑鸿 webDay15总结

掌握文件下载的方式:?
第一种:超链接下载.直接将文件的路径写到超链接的href中.---前提:文件类型,浏览器不支持.
第二种:手动编写代码的方式完成文件的下载.
    * 设置两个头(setHeader)和一个流:
    * Content-Type                :文件的MIME的类型.
    * Content-Disposition        :以下载的形式打开文件.
    * InputStream                :文件的输入流.


掌握注册-登录案例:
重定向与转发:
【重定向】response.sendRedirect(String path); -- 完成重定向
【转发】request.getRequestDispatcher(String path).forward(request,response);
【区别】1.转发的地址栏不变的.重定向的地址栏发生变化的.
             2.转发是一次请求一次响应,重定向是两次请求两次响应.
             3.request域对象存取的值在转发中是有效的,在重定向无效的.
             4.转发的路径不需要加工程名.重定向的路径需要加工程名.


同时request也是域对象 可以存储数据 在请求发出时创建request对象 响应回来后即销毁 所以它的生命周期:一次请求-响应的事件内
回复 使用道具 举报
常小天
今天学习的内容继续是servlet的知识。通过今天的两个案例来总结今天的学习内容。案例一是文件下载。实现方法有两个,一是超链接形式,这种方式只能在浏览器不支持的文件种类上实现下载。第二个方法就是通过手动编写代码完成下载。操作步骤可总结为设置两个头和一个流,即设置content-type:文件的mime类型,告诉浏览器下载的是什么类型的文件;设置Content-Disposition,告诉浏览器这个文件只能以下载的方式打开;设置Inputstream,文件输入流。这里着重说一下设置流。因为在web项目中我们无法再像以前一样通过相对路径来创建一个输入流,所以需要通过新的方式来创建这个流。这里提供两个方法。一是域对象servletcontext的getResourceAsStream方法,该方法需要的参数是我们要读取的文件的服务器绝对路径,也就是/项目名…形式的一个路径,它可以返回一个输入流。第二个方法是servletcontext的getRealPath方法,向它传入一个服务器绝对路径,它可以返回一个一盘符开始的磁盘绝对路径,再将这个磁盘绝对路径传入输入流构造方法获得一个输入流。以上三个设置都处理好之后,就可以配合response.getOutputStream()获得的response专属的输出流来进行文件的下载。文件下载实际就是从服务器读取再向客户端的磁盘写入的过程。
案例二是注册案例。本案例中我们要将用户填写的注册信息接收,并在数据库中查重,判断可以使用后再添加进数据库,最后跳转页面并给出相应提示。事实上这个案例与昨天的登录案例大同小异。在业务流程上依然是浏览器发送请求,servlet接收数据,封装成对象,调用业务层对象service,service对象再通过调用一个或多个DAO方法完成业务,并向servlet返回数据处理结果,servlet对结果进行判断并作出相应的响应。这些内容就不再多说,这里要说的是与昨天的一些区别的地方。新的内容有两项。一是一个新的域对象request。不同于servletcontext,request的生命周期更短,request在浏览器发送请求后创建,在本次响应后销毁,其作用范围与生命周期相同。第二项内容就是转发和重定向的区别。重定向是访问的第一个servlet响应一个重定向的状态码和一个新的地址给浏览器,浏览器再向这个新的地址发送请求,新的servlet再作出响应,并且这里的新的地址可以是服务器外的地址。所以是两个请求和响应,request域对象就不能在两次响应中传递数据。转发是访问的第一个servlet不响应,将请求转发给第二个servlet,由第二个servlet作出响应,整个过程只有一次请求和响应,并且这里的第二个servlet只能是在本服务器中的servlet,所以可以通过request域对象来传递信息。
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马