request&&response

笔记

1、Servlet配置方式:

全路径匹配:

  以/开始  /a   /a/b   /类名

路径匹配:前半段匹配,*代表的是通配符,匹配任意文字

   以/开始,但是以*结束  /a/*   /*

以扩展名匹配:

   写法:*.扩展名    *.do   *.action

  1. ServletContext的API:

2.1:servletContext的用法:

ServletContext上下文

每一个web工程只有一个servletcontext对象,说明了也就是不管在那个servlet里面,获取到的这个类的对象都是同一个。

//获取servletContext对象你,不管在那个servlet获取的对象都是一个

ServletContext context=getServletContext();

/*System.out.println(context);*/

//获取全局参数

String contextName = context.getInitParameter("username");

System.out.println(contextName);

2.2:servletContext普通方式读取工程文件:

InputStream stream=new FileInputStream("classes/db.properties");

prop.load(stream);*/

//获取文件里面属性的值

/*String driver = prop.getProperty("driver");

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

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

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

System.out.println("driver"+driver);

System.out.println("username"+username);

System.out.println("url"+url);

System.out.println("drpassword"+password);

总结:

此处,如果想获取web工程下的资源,用普通FileInputStream写法是不行的

 * 因为路径是不对的。这里相对路径,其实是根据jre来确定的,但是我们这是一个

 * web工程,jre后面会由tomcat管理,所以这里真正相对的路径是tomcat里面的bin

 * 目录。

2.2:servletContext获取资源文件1:

可以获取web应用中的资源:

  1. 获取资源在tomcat里面的绝对路径

//获取servletContext对象

ServletContext context=getServletContext();

//获取到了web工程的路径,获得是绝对路径

String path = context.getRealPath("file/db.properties");

System.out.println(path);

context.getRealPath(“”);//这里得到的是项目在tomcat里面的根目录。

    结果:D:\AllSoftware\apache-tomcat-7.0.52\apache-tomcat-7.0.52\webapps\servletdemo

context.getRealPath("file/db.properties");

    结果:D:\AllSoftware\apache-tomcat-7.0.52\apache-tomcat-7.0.52\webapps\servletdemo\file\db.properties

 

2.2:servletContext获取资源文件2:

getResourceAsStream:直接给相对路径,转化成流对象

//获取servletContext对象

ServletContext context=getServletContext();

Properties prop=new Properties();

//获取web工程下的资源,转化成流对象,掐年隐藏当前工程的根目录。

/**

 * 相对路径:有参照物,相对谁呀,

 * file/db.properties

 * a路径-工程在tomcat里面的根目录

 * D:\AllSoftware\apache-tomcat-7.0.52\apache-tomcat-7.0.52\webapps\servletdemo

 * b路径-

 * D:\AllSoftware\apache-tomcat-7.0.52\apache-tomcat-7.0.52\webapps\servletdemo+

 * file/db.properties

 * 绝对路径:D,E盘,没有参照物

 */

InputStream is=context.getResourceAsStream("file/db.properties");

prop.load(is);

String driver=prop.getProperty("driver");

String user=prop.getProperty("user");

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

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

System.out.println("driver="+driver);

System.out.println("user="+user);

System.out.println("password="+password);

System.out.println("url="+url);

 

2.3:使用ClassLoader获取资源

使用ClassLoader获取web工程下的资源文件,类加载器

//获取servletContext对象

/*ServletContext context=getServletContext();*/

Properties prop=new Properties();

//获取java文件的class,然后获取加载这个class到虚拟机中那个类加载器对象

/**

 * 相对路径:

 */

InputStream is=this.getClass().

getClassLoader().getResourceAsStream("../../file/db.properties");

prop.load(is);

String driver=prop.getProperty("driver");

String user=prop.getProperty("user");

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

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

System.out.println("driver="+driver);

System.out.println("user="+user);

System.out.println("password="+password);

System.out.println("url="+url);

2.4:servletContext:有什么作用?

1、获取全局配置参数

2、获取web工程中的资源

3、存取数据,servlet间共享数据,域对象

2.4:servletContext:存取数据

存储的方法:context.setAttribute("键",变量值 );

取出的方法:context.getAttribute("键" );

2.5:案例:登录,获取登录的次数

2.6:ServletContext何时创建,何时销毁?

服务器启动的时候,会为托管的每一个web应用程序,创建一个servlet对象,

从服务器移动托管,或者是关闭服务器。

2.7:ServletContext的作用范围:

只要在这个项目;里面,只要是同一个项目就可以。

在A项目中去存,在B项目去取,是不可能取出来的。

因为ServletContext对象是不同的。

3、HTTPServletRequest:

这个对象封装了客户端提交过来的一切数据

第一种方法:

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

System.out.println(name);

第二种方式:

Enumeration<String> parameterNames = request.getParameterNames();

while (parameterNames.hasMoreElements()) {

String string = (String) parameterNames.nextElement();

String value = request.getParameter(string);

System.out.println("value==="+value);

}

第三种方式:

Map<String, String[]> map = request.getParameterMap();

Set<String> set = map.keySet();

for (String s : set) {

String value=request.getParameter(s);

System.out.println("value===="+value);

}

 

3.1:中文乱码:

客户端提交数据交给服务端,如果数据中带有中文的话,有可能会出现乱码情况,参照以下的方法:

如果是get方式:

来一个请求解决一个一个。

 * 1、name=new String(name.getBytes("ISO-8859-1"),"UTF-8");

 * 2、修改tomcat:

 * 设置请求编码格式:request.setCharacterEncoding("UTF-8");

 * <Connector port="8088" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" useBodyEncodingForURI="true"/>

 */

如果是post的方式:

设置request.setCharacterEncoding("UTF-8");设置请求体的文字编码 格式,一定写在获取参数之前。

4、httpServletRespouse:

负责返回数据给客户端:

输出数据到页面上:

//响应数据,响应在浏览器上,以字符的形式写入到浏览器

response.getWriter().write("<a href='##'>HttpServletResponseDemo1</a>");

//字节流的形式流入到浏览器

//response.getOutputStream().write("HttpServletResponseDemo1".getBytes());

 

4.1:中文乱码:

响应数据中,有中文,响应的时候,有可能会乱码

以字符流输出:

  //指定输出到客户端,这些文字变成UTF-8

response.setCharacterEncoding("UTF-8");

//直接规定浏览器用什么格式去看

//response.setHeader("Content-Type", "text/html;charset=UTF-8");

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

//这里响应出去的编码格式是:ISO-8859-1

response.getWriter().write("你好吗?")

以字节流输出:

//指定输出到客户端,这些文字变成UTF-8

//response.setCharacterEncoding("UTF-8");

//直接规定浏览器用什么格式去看

//response.setHeader("Content-Type", "text/html;charset=UTF-8");

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

//这里响应出去的编码格式是:UTF-8,如果想要指定具体的编码格式,可以在getBytes

//数组进行指定,查看源码,确认一下响应出去的编码格式是:UTF-8

response.getOutputStream().write("我爱你".getBytes("UTF-8"));

 

  1. 演练下载资源:
  1. 直接以超链接的方式下载,不写任何代码,也够下载东西下来。

原因是:tomcat中有一个defaultServlet,这个defaultServlet专门用于处理放在tomcat服务器上静态资源。

<a href="download/aa.jpg">aa.jpg</a><br/>

<a href="download/bb.txt">bb.txt</a><br/>

<a href="download/cc.rar">cc.rar</a><br/>

  1. 手动编码:

 

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

System.out.println(fileName);

ServletContext context = getServletContext() ;

//获取tomcat里面的绝对路径

String path=context.getRealPath("download/"+fileName);

//设置响应头,Content-Disposition 的作用:当Content-Type

//的类型为要下载的类型时 , 这个信息头会告诉浏览器这个文件的名字和类型

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

//转换成流

InputStream is=new FileInputStream(path);

//以字节的形式去流

OutputStream os= response.getOutputStream();

int len=0;

byte[] buffer=new byte[1024];

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

os.write(buffer,0,len);

}

os.close();

is.close();

 

5.1:演练中文资源的下载:

//解决乱码:

request.setCharacterEncoding("UTF-8");

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

System.out.println(fileName);

ServletContext context = getServletContext() ;

//获取tomcat里面的绝对路径

String path=context.getRealPath("download/"+fileName);

/**

 * 如果文件的名字带有中文,那么需要对这个名字进行编码处理

 * 如果是IE,或者是谷歌,使用URLEcoding编码

 * 如果是火狐,使用Base64编码

 */

fileName=URLEncoder.encode(fileName,"UTF-8");

 

//设置响应头,Content-Disposition 的作用:当Content-Type

//的类型为要下载的类型时 , 这个信息头会告诉浏览器这个文件的名字和类型

//attachment以下载的方式去提醒用户,而不是直接去查看文件

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

//转换成流

InputStream is=new FileInputStream(path);

//以字节的形式去流

OutputStream os= response.getOutputStream();

int len=0;

byte[] buffer=new byte[1024];

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

os.write(buffer,0,len);

}

os.close();

is.close();

 

  1. 跳转:

重定向:原始的写法:

response.setStatus(302);

response.setHeader("Location", "login_success.html");

现在的写法:

response.sendRedirect("login_success.html");

请求转发:

request.getRequestDispatcher("/login_success.html").forward(request, response);

请求的转发和重定向:

 转发的例子:有人打电话到公司找我,之后电话转接到我这

 包含(include)的例子:有人打电话找我问问题,但是电话没有转接功能,

 我把答案告诉前台,前台再去告诉这个人。

 重定向例子:有人打电话找我,我不在公司,前台把电话告诉你,你再给我打电话

  ①本质区别:转发只发出了一次请求,而重定向发出了两次请求

 具体特点:

  ①转发:地址栏是初次发出请求的地址

  重定向:地址栏不再是初次发出的请求的地址,

  地址栏为最后响应的那个地址。

  ②转发:在最终的Servlet中,Request对象和中转的那个request是同一个

  重定向:在最终的Servlet中,Request对象和中转的那个request不是同一个

  ③转发:只能转发到当前web应用的资源

重定向:可以重定向到任何资源。

  ④转发:/代表的是当前web应用的根目录

  重定向:/代表的是当前web站点的根目录

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值