WEB-request&response

WEB-request&response篇

1.1      案例一:读取WEB工程下的文件.

1.1.1    需求:

现在有一个配置文件在web工程的src下,项目要发布到tomcat中,需要编写一段程序读取文件.

1.1.2    分析:

1.1.2.1  技术分析:

【使用ServletContext对象读取WEB项目下的文件】

* InputStream getResourceAsStream(String path); ---根据提供路径读取文件返回一个文件的输入流.

* String getRealPath(String path); --- 返回一个路径的磁盘绝对路径.

1.1.3    代码实现:

1.1.3.1  使用getResourceAsStream读取

    /**

     * 使用ServletContext中的getResourceAsStream读取.

     * @throws FileNotFoundException

     * @throws IOException

     */

    privatevoid test2() throws FileNotFoundException, IOException {

   

        // 获得ServletContext:

        ServletContext context =this.getServletContext();

        InputStream is =context.getResourceAsStream("/WEB-INF/classes/db.properties");

        Properties properties = new Properties();

        properties.load(is);

       

        String driverClass =properties.getProperty("driverClass");

        String url =properties.getProperty("url");

        String username = properties.getProperty("username");

        String password =properties.getProperty("password");

       

        System.out.println(driverClass);

        System.out.println(url);

        System.out.println(username);

        System.out.println(password);

    }

1.1.3.2  使用getRealPath读取文件:

/**

     * 使用ServletContext中的getRealPath读取.

     * @throws FileNotFoundException

     * @throws IOException

     */

    privatevoid test3() throws FileNotFoundException, IOException {

        // 获得ServletContext:

        ServletContext context =this.getServletContext();

        String realPath = context.getRealPath("/WEB-INF/classes/db.properties");

        // 获得该文件的磁盘绝对路径.

        System.out.println(realPath);

        InputStream is = newFileInputStream(realPath);

       

        Properties properties = new Properties();

        properties.load(is);

       

        String driverClass =properties.getProperty("driverClass");

        String url =properties.getProperty("url");

        String username =properties.getProperty("username");

        String password =properties.getProperty("password");

       

        System.out.println(driverClass);

        System.out.println(url);

        System.out.println(username);

        System.out.println(password);

    }

1.1.4    总结:

1.1.4.1  ServletContext的功能:

【功能一:读取全局初始化参数】

 

【功能二:获得文件的MIME的类型】

【功能三:作为域对象存取数据】

范围:整个web项目.而且全局的对象.

创建:服务器启动的时候,服务器为每个web项目创建一个单独的ServletContext对象.

销毁:服务器关闭的时候销毁ServletContext.

【功能四:读取web项目下的文件】

 

1.2      案例二:登录成功后,完成文件的下载.

1.2.1    需求:

在登录成功后,页面跳转到文件下载的列表的页面,点击列表中的某些链接,下载文件.

1.2.2    分析:

1.2.2.1  技术分析:

【Response的概述】

Ø  Response:代表响应的对象.从服务器向浏览器输出内容.

【Response的常用的API】

Ø  响应行:

* 设置状态码.

Ø  响应头:

* 针对一个key对应多个value的头信息.

* 针对一个key对应一个value的头信息.

Ø  响应体

【文件下载的方式】

Ø  一种:超链接下载.直接将文件的路径写到超链接的href中.---前提:文件类型,浏览器不支持.

Ø 二种:手动编写代码的方式完成文件的下载.

* 设置两个头和一个流:

    * Content-Type           :文件的MIME的类型.

    * Content-Disposition    :以下载的形式打开文件.

    * InputStream            :文件的输入流.

1.2.3    代码实现

1.2.3.1  步骤一:将之前的登录功能准备好:

 

1.2.3.2  步骤二:在文件下载列表页面上添加文件下载的链接:

 

1.2.3.3  步骤三:完成文件下载的代码的实现:

public class DownloadServlet extends HttpServlet {

    privatestatic final long serialVersionUID = 1L;

 

    protectedvoid doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {

        // 1.接收参数

        String filename =request.getParameter("filename");

        // 2.完成文件下载:

        // 2.1设置Content-Type头

        String type =this.getServletContext().getMimeType(filename);

        response.setHeader("Content-Type",type);

        // 2.2设置Content-Disposition头

        response.setHeader("Content-Disposition","attachment;filename="+filename);

        // 2.3设置文件的InputStream.

        String realPath =this.getServletContext().getRealPath("/download/"+filename);

        InputStream is = newFileInputStream(realPath);

        // 获得response的输出流:

        OutputStream os =response.getOutputStream();

        int len = 0;

        byte[] b = new byte[1024];

        while((len = is.read(b))!= -1){

            os.write(b,0, len);

        }

        is.close();

    }

 

    protectedvoid doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {

        doGet(request, response);

    }

 

}

1.2.3.4  response输出响应内容的方法:

向页面响应的方法:

* getOutputStream();

* 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”);

1.3      案例三:完成用户注册的功能:

1.3.1    需求:

网站首页上点击注册的链接,跳转到注册页面,在注册页面中输入信息.完成注册:(将数据保存到数据库中)

1.3.2    分析:

1.3.2.1  技术分析:

【Request的概述】

Ø  Request代表用户的请求.

【Request的API】

功能一:获得客户机相关的信息

Ø  获得请求方式:

Ø  获得请求的路径:

Ø  获得客户机相关的信息:

Ø  获得工程名:

功能二:获得从页面中提交的参数:

功能三:作为域对象存取数据:

1.3.3    代码实现:

1.3.3.1  步骤一:创建数据库和表:
1.3.3.2  步骤二:创建包和类:
1.3.3.3  步骤三:引入注册页面:
1.3.3.4  步骤四:注册代码的实现:

 

1.3.4    总结:

1.3.4.1  处理request接收参数的中文乱码的问题:

现在无论是GET还是POST提交中文的时候,都会出现乱码的问题.

解决:

Ø  POST的解决方案:

* POST的参数在请求体中,直接到达后台的Servlet.数据封装到Servlet中的request中.request也有一个缓冲区.request的缓冲区也是ISO-8859-1编码.

* 设置request的缓冲区的编码:

    *request.setCharacterEncoding(“UTF-8”); --- 一定要在接收参数之前设置编码就OK.

Ø  GET的解决方案:

* 1.修改tomcat的字符集的编码.(不推荐)

* 2.使用URLEncoder和URLDecoder进行编码和解码的操作.

* 3.使用String的构造方法:

1.3.4.2  Request作为域对象存取数据:

使用request对象存取数据:

* setAttribute(Stringname,String value);

* Object getAttribute(Stringname);

 

request的作用范围:

* 作用范围就是一次请求的范围.

* 创建和销毁:

    * 创建:客户端向服务器发送了一次请求以后,服务器就会创建一个request的对象.

    * 销毁:当服务器对这次请求作出了响应之后.

 

1.3.4.3  重定向和转发的区别:(redirect和forward的区别)

* 1.重定向的地址栏会发生变化,转发的地址栏不变.

* 2.重定向两次请求两次响应,转发一次请求一次响应.

* 3.重定向路径需要加工程名,转发的路径不需要加工程名.

* 4.重定向可以跳转到任意网站,转发只能在服务器内部进行转发.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值