servlet涉及对象

来源:互联网 发布:网络视频服务器使用 编辑:程序博客网 时间:2024/05/01 03:42
ServletConfig对象(封装servlet的配置信息)1)在Servlet的配置文件中,可以使用一个或多个<init-param>(在servlet标签中配置)标签为Servlet配置一些初始化参数。当Servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。2)通过getServletConfig()方法得到对象即可ServletContext对象1)Web容器在启动时,它会为每个web应用程序创建一个对应的ServletContext对象,它代表当前web应用。ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时。可以通过ServletConfig.getServletContext方法获得ServletContext对象。通过this同样可以获得此对象。2)由于一个web应用中的所有Servlet共享同一个ServletContext对象,所以多个Servlet通过ServletContext对象实现实现数据共享。ServletContext对象通常也被称之为context域对象。3)Servlet应用程序范围。例如,实现不同servlet共享4)使用context-param(在web-app标签下配置)可以配置整个web应用的初始化参数,通过getInitParameter方法获得5)区分重定向与转发,重定向让客户端自己在发一次请求,即服务器接收了两次请求,转发是客户端帮忙找到目标,服务器接收了客户端一次请求6)servlet转发,使用getRequestDispatcher方法RequestDispatcher rd = this.getServletContext().getRequestDispatcher("xx.jsp");rd.forward(request,response)(不过把数据带给jsp不能通过context域,应该使用request域,由于大家共享,很对人访问时,就会造成数据紊乱的问题)7)服务器启动创建,删除web应用或者停止服务器销毁8)配置文件,数据之间没有关系,一般用properties,有关系使用xml9)ServletContext对象读取web应用中的配置文件方法一:InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/xxx.properties");//读取资源文件时注意路径,最好使用以上方式,若使用传统方式如FileInputStream,若使用相对路径是相对java虚拟机启动位置,即binProperties props = new Properties();props.load(in);//存在了map集合中String value = props.getProperty("xxxx");方法二(获取绝对路径读):String path = this.getServletContext().getRealPath("/WEB-INF/classes/xxx.properties");//此种方法好处在于还可以获得资源名称FileInputStream in = new FileInputStream(path)//接下来同方法一10)web应用中的普通资源如何读取资源文件如果读取资源文件的不是servlet的话,就只能通过类装载器去读,当然可以同过传递ServletContext对象进行读取,但是会不符合分层设计思想public class UserDao{public void update() {InputStream in = UserDao.class.getClassLoader().getResourceAsStream("相对该类加载器的位置的文件位置");//InputStream in = UserDao.class.getResourceAsStream("相对该类位置的文件位置");//通过类装载器读取配置文件注意不能太大,而且他像装载类一样,只装载一次//服务器没有停止,则改动配置文件后内存中的配置文件并没有影响//如果有读取更新后文件的需求,需要得到文件位置,改用传统方式来读,如下://String path = UserDao.class.getClassLoader().getResource("").getPath();//FileInputStream in = new FileInputStream(path);}}Request和Response对象web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象;request和response对象既然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了,要向客户机输出数据,只需要找response对象就行了。Response对象1)HttpServletResponse对象是服务器的响应,这个对象中封装了向客户端发送数据(如getWriter(),getOutputStream())、发送响应头(如setHeader()、addHeader())、发送响应码(如setStatus())的方法2)OutputStream输出数据问题:浏览器所用码表一般为gb2312(可修改),而我们一般做到通用一般使用utf-8来编码,所以可以使用response对象告诉浏览器如何解码(即程序以什么码表输出了,程序就要以什么码表打开):response.setHeader("Content-type","test/html;charset=UTF-8");String data = "中国";OutputStream out = response.getOutputstream();out.write(data.getBytes("UTF-8"));//html:<meta>标签可以模拟一个http响应头,如下所示://String data = "中国";//OutputStream out = response.getOutputstream();//out.write("<meta http-equiv='content-type' content='text/html;charset=utf-8'>".getBytes());//out.write(data.getBytes("UTF-8");//注意:text/html;charset=utf-8中的分号写成逗号,浏览器会提示下载资源3)Writer输出数据问题:Writer输出数据时,response交给服务器再交给浏览器是使用的是iso-8859-1码表,所以需要指定response输出码表://设置response使用的码表,以控制response以什么码表向浏览器写出数据response.setCharacterEncoding("UTF-8");//指定浏览器以什么码表打开服务器发送的数据response.setHeader("content-type","test/html;charset=utf-8");//response.setContentType("test/html;charset=utf-8");//等于以上两句代码String data = "中国";PrintWriter out = response.getWriter();out.writer(data);4)文件下载和中文文件下载:String path = this.getServletContext().getRealPaht("/../1.jpg");String filename = path.substring(path.lastIndexOf("\\")+1);response.setHeader("content-disposition","attachment;filename="+filename);//文件名字是中文,文件名需要经过URL编码:URLEncoder.encode(filename,"utf-8")InputStream in = new FileInputStream(path);//...5)输出随机验证码图片,并做到点击更换:见文件夹:验证码代码通过BufferImage在内存中创建图片通过Graphics在图片中画出图形通过ImageIO从内存中写出图片注册页面使用验证码图片时:<img src="servlet路径"/>(注意解决图片缓存问题)6)控制浏览器定时刷新:response.setHeader("refresh","3");//response.setHeader("refresh","3;url=''");//以上代码很少使用,因为输出数据最终由Jsp输出,开发常用方法:response.setCharEncoding("UTF-8");response.setContentType("text/html;charset=utf-8");String message="<meta http-equiv='refresh' content='3;url='>恭喜你,本浏览器3秒后自动跳转";//<meta>标签模拟头this.getServletContext().setAttribute("message",message);//使用此对象不合适的,此处只是为了举例this.getServletContext().getRequestDispatcher("").forward(respuest,response);7)控制缓存:response.setDateHeader("expires",System.currentTimeMillis()+1000*3600);//注意时间的设置8)实现请求重定向 方法一:response.setStatus(302);response.setHeader("location","");方法二:response.setRedirect("");减少使用重定向,增加服务器压力,登录时使用,为了在地址栏显示首页地址,还有购物,跳转购物车页面时使用转发会多购买一次,使用重定向则不会;特点:浏览器会向服务器发送两次,意味着就有2个request\response;浏览器地址会变化9)response细节getOutputStream和getWriter()方法分别用于得到输出二进制数据、输出文本数据的ServletOutputStream、Printwriter;这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法(不只是在一个servlet中不能,在转发(不是重定向)到另一个servlet中两个servlet都不能使用了,注意调用链);Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当做响应消息的正文,然后再与响应状态行和各响应头输出到客户端;Servlet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用了close方法,如果没有,servlt引擎将调用close方法关闭该输出流对象(其他的流要注意关闭)。request对象1)HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。2)http://www.baidu.com/news/1.html URL/URI/news/1.html URIURI>URL:URI可以表示任何一个资源;URL只可以标识互联网上的资源3)常用方法:getRequestURL方法返回客户端发出请求时的完整URLgetRequestURI方法返回请求行中的资源名部分getQueryString方法返回请求行中的参数部分getRemoteAddr方法返回发出请求的客户机的IP地址getRemoteHost方法返回发出请求的客户机完整主机名(在DNS注册后才会返回,否则返回的是IP)getRemotePort方法返回客户机所使用的网络端口号getLocalAddr方法返回web服务器的IP地址getLocalName方法返回web服务器的主机名getMethod得到客户机请求方式4)获取请求头和请求数据获取请求数据(获取请求数据时一般来说都要先检查再使用)if(value != null && value.trim().equals(""))使用getParameterMap方法得到的map数值类型为Map<String, String[]>(应用:得到map集合后使用beanUtils可以直接封装在formbean里)5)通过表单收集客户端数据url后面跟的中文数据,要编码后再提交(看Jsp页面)6)中文乱码问题//改变request使用的码表,否则为iso-8859-1,只对post有效request.setCharacterEncoding("UTF-8");//解决post提交的乱码//解决get提交的乱码(手工处理)String username = request.getParameter("username");username = new String(username.getBytes("iso8859-1"),"utf-8");//超链接提交的中文,服务器想不乱码,也只能手工处理、、、、、//也可以通过更改服务器设置,但是开发不使用,因为是远程部署到服务器,而且使用的web服务器也不一定使用哪个,这里讲的是tomcat服务器//通过查阅文档,Http->URLEncoding,改变connector的这个属性即可,或者useBodyEncodingForURI属性值设置为true;7)request实现请求转发请求转发指一个web资源收到客户端请求后,通知服务器去调用另一个web资源进行处理。应用场景(MVC模式)request对象提供一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象forward方法可以实现请求转发。request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其他web资源处理。(setAttribute方法、getAttribute方法、removeAttribute方法、getAttributeNames方法)String data = "aaaaa";request.setAttribute("data",data);request.getRequestDispatcher("/message.jsp").forward(request,response);8)froward细节__1froward方法用于将请求转发到RequestDispatcher对象封装的资源__2如果在调用forward方法之前,在Servlet程序中写入的部分内容已经被真正地传动到了客户端,forward方法将抛出IIIlegalstateException异常//案例一:String data = "aaa";PrintWriter writer = response.getWriter();writer.write(data);writer.close();//以下跳转会导致:java.lang.IllegalStateException:Cannot forward after response has bean ...request.getRequestDispatcher("/message.jsp).forward(request,response);//案例二(错误类型如案例一)://养成习惯,前面调用转发后一定加上return,否则会有以上异常if(true){request.getRequestDispatcher("/message.jsp).forward(request,response);return;}request.getRequestDispatcher("/message.jsp).forward(request,response);__3如果在调用forward方法之前向Servlet引擎的缓冲区(response)写入了内容,只要写入到缓冲区中的内容还没有真正输出到客户端,forward方法就可以被正常执行,原来写入到输出缓冲区中的内容将被清空,但是,已写入到HttpServletResponse对象中的响应头字段信息保持有效。String data = "aaa";PrintWriter writer = response.getWriter();writer.write(data);//writer.close();没有关闭流,没有写入客户端,会清空,但是加上注意会报异常request.getRequestDispatcher("/message.jsp).forward(request,response);9)mvc设计模式((model javabean)、(view jsp)、(control servlet))10)用include实现页面包含(被包含页面不要出现全局架构标签,因为全部内容都被包含了进去):request.getRequestDispatcher("head.jsp").include(request,response);response.getWriter().writer("hhhhh<br/>");request.getRequestDispatcher("foot.jsp").include(request,response);11)web工程中各类地址的写法(绝对路径):tip:获取的资源是服务器使用的,/代表web应用;获取的资源是浏览器使用的,/代表网站request.getRequestDiapatcher("").forward(request,response);//服务器response.sendRedirect("");//浏览器this.getServletContext().getRealPath("");//服务器 this.getServletContext().getResourceAsStream("");//服务器<a href="">content</a>//浏览器<from antion=""></form>//浏览器另一种使用相对路径,以后应用中再理解12)防盗链String referer = reequest.getHeader("referer");if(referer==null || ! referer.startsWith("")){response.sendirect("");return;}...

1 0
原创粉丝点击