笔记
1、Servlet配置方式:
全路径匹配: 以/开始 /a /a/b /类名 |
路径匹配:前半段匹配,*代表的是通配符,匹配任意文字 以/开始,但是以*结束 /a/* /* |
以扩展名匹配: 写法:*.扩展名 *.do *.action |
- 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应用中的资源: |
//获取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")); |
- 演练下载资源:
原因是: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/> |
|
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(); |
- 跳转:
重定向:原始的写法: 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站点的根目录
|