java基础(二十一):Servlet

1.servlet基本概念
2.ServletConfig
3.ServletContext
4.response
5.request
6.请求转发和请求重定向区别


                

1.servlet基本概念:动态web开发技术

         (1).Servlet调用过程

                  输入网址==>查找本地hosts==>如果没有就查找DNS(查到后到服务器端)==>服务器端根据请求头分析请求的是哪个虚拟主机==>再分析请求的是虚拟主机下的哪个web应用==>再分析需要web应用下的什么资源==>根据web.xml查找到资源==>写入到response对象里组织成相应消息传给浏览器

         (2).Servlet生命周期

                  Servlet第一次访问创建Servlet对象,调用init()方法。后来每次访问,调用service()方法。当应用移除或者服务器关闭,Servlet对象销毁,调用destroy()方法。

         (3).Servlet的继承接口:

                  Servlet==>GenericServlet==>HttpServlet

         (4).Servlet的一些细节:

                  ^1:一个<servlet>可以对应多个<servlet-mapping>,即一个setvlet可以有多个访问路径。

                  ^2:<url-pattern>中支持*,但是*只能在两种情况下使用:         

                           第一:/aa/bb/*,即*写在地址最后面

                           第二:*.后缀

                           注:如果一个地址匹配多个,和哪个最像用哪个。但是*.后缀的优先级最低

                  ^3:<url-pattern>中有一个地址为“/”,这是缺省Servlet,当别的Servlet都没匹配到的时候,就匹配这个。

                           注:400,500页面,静态资源的访问都是靠的缺省Servlet

                  ^4:Servlet中<load-on-startup>标签用来表示启动顺序,其中值为1表示最先启动

                  ^5:Servlet存在线程安全问题,解决办法就是加锁

2.ServletConfig:配置信息对象

         getServletName():获取当前servlet在web.xml中的名称

         getInitParameter(String name):获取指定名称的初始化参数

         getInitParameterNames():获取所有初始化参数的名字

         getServletContext():获取ServletContext对象

3.ServletContext:代表当前web对象

         (1).作为域对象在整个web应用中被共享

                  域对象:在指定的域范围内该对象的内容可以被共享

                  生命周期:服务器启动web应用创建ServletContext,web应用被移除或者服务器关闭ServletContext对象被销毁。

                  setAttribute(String attr,Object obj);

                  getAttribute(String attr);

                  removeAttribute(String attr);

         (2).获取参数

                  getInitPatameter():获取初始化参数

                  getParameter(String para):获取请求参数

                  getAttribute(String attr):获取域对象的键值对

         (3).请求转发

                  RequestDispatcher dispatcher = this.getServletContext.getRequestDispatcher("/servlet2");

                  dispatcher.forward(req,resp);

         (4).加载资源文件

                  this.getServletContext.getRealPath("文件名");

                  具体写法(2种):

                           ^1:(servlet下)

                                Properties prop = new Properties();

                                prop.load(new FileReader(this.getServletContext.getRealPath("config.properties")));

                           ^2:(非servlet,用类加载器)

                                Properties prop = new Properties();

                                prop.load(new FileReader(Service.class.getClassLoader.getResource("config.properties").getPath()));

4.response:响应浏览器的对象

         (1).解决编码问题:

                  req.setCharacterEncoding("utf-8");

                  resp.setCharacterEncoding("text/html;charset=utf-8");

                  resp.setContentType("text/html;charset=utf-8");

         (2).文件下载

                  resp.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode("啊啊啊.jpg","utf-8"));

         (3).定时刷新

                  resp.setHeader("Refresh","3;url=/test/1.html");

                  注:也可以在前台设定定时刷新:

                           <meta http-equiv="refresh" content="3,url=/test/1.html" />

         (4).缓存

                  设置不要缓存:

                           resp.setIntHeader("Expires","-1");

                           resp.setHeader("Cache-Control","no-cache");

                           resp.setHeader("Pragma","no-cache");

                  设置缓存时间:

                           resp.setDateHeader("Expires",System.getCurrentMillis+3600*24);

         (5).请求重定向

                  resp.sendRedirect("/test/1.html");

         (6).Servlet的service()方法结束后,如果getWriter()和getOutputStream()方法没有关闭,就会后台自己调用关闭掉。

5.request:浏览器请求的对象

         (1).获取客户机信息

                  getRequestURL():获取URL

                  getRequestURI():获取URI

                  getRemoteAddr():获取IP

                  getContextPath():获取web应用虚拟目录地址

                  getQueryString():获取请求行信息

                  getMethod():获取请求方式

         (2).获取请求行参数

                  getHeader(String name);

                  getIntHeader(String name);

                  getDateHeader(String name);

                  getHeaders(String name);

                  getHeaderNames();

         (3).请求参数乱码设置

                  get方法:req.setCharacterEncoding("utf-8");

                  post方法:String str = new String(req.getParameter("username").getBytes("iso8859-1"),"utf-8");

         (4).作为域对象

                  ^1.作用范围:整个请求链

                  ^2.生命周期:服务器收到请求,创建Request开始;请求结束,Request销毁

                           setAttribute(String attr,Object obj);

                           getAttribute(String attr);

                           remove(String attr);

                  ^3.请求转发:

                           req.getRequestDispatcher("地址").forward(req,resp);

                           this.getServletContext.getRequestDispatcher("地址").forward(req,resp);

                  ^4.请求包含(将两个资源合并后输出)

                           req.getRequestDispatcher("地址").include(req,resp);

                           this.getServletContext.getRequestDispatcher("地址").include(req,resp);

6.请求转发和请求重定向区别

         请求转发:一次请求一次响应,不改变地址栏信息

         请求重定向:两次请求两次响应,改变地址栏

         注:需要用到request域传递属性,用请求转发

                如果两者都可以用,建议用请求转发,节省资源

         

猜你喜欢

转载自blog.csdn.net/qq_40594696/article/details/85958057