1.Servlet的主要作用
(1)接收请求
(2)处理请求
(3)完成响应
2.Servlet定义
狭义上的Servlet:仅仅指的是这个servlet接口
广义的Servlet:不仅包含该Servlet接口,还包含该Servlet的接口的子类! Servlet是JavaWeb部分的三大组件之一: JavaWeb部分三大组件:Servlet、Filter、Listener,这三个组件都需要交给web服务器管理! 自定义一个Servlet: 1).自定义一个类实现Servlet接口,实现接口中的方法 2).将自定义的servlet类在web.xml文件中配置一下!3.Servlet生命周期
含义:Servlet生命周期:就是Servlet对象由产生到销毁的过程
涉及到的几个方法: 1)构造器:servlet对象不是在tomcat服务器启动的时候创建的,而是在我们第一次 访问该servlet的时候调用,该构造器只会被执行一次,说明该Servlet是单例的! 但是是多线程的! 2)init方法:在我们第一次访问该Servlet时候调用【在构造器被调用之后紧接着被调用】 该方法只会被调用一次 3)service方法:每次我们访问该Servlet的时候,这个service方法都会被调用一次! 所以我们写的业务逻辑代码,主要就写在这个方法中! 4)destroy方法:该方法会在项目被卸载的时候【服务器关闭】会被调用一次!4.Servlet相关接口
①ServletConfig
代表:代表当前servet的配置信息,每个servlet对应唯一的一个ServletConfig对象 <servlet> <servlet-name>BServlet</servlet-name> <servlet-class>com.neuedu.servlet.BServlet</servlet-class> </servlet> 获取:该是由Tomcat服务器创建,然后通过参数的形式传递给init方法, 我们只需要在init方法中使用就可以! 功能: 1)获取当前servlet的名称[getServletName()] 2)获取当前servlet的初始化参数[getInitParameter("username")] 3)获取Servletcontext[getServletContext()] ②ServletContext ServletContext: 代表:ServletContext代表的是当前web应用! 获取 :通过ServletConfig对象获取[getServletContext()] 功能: 1)获取整个web应用的初始化参数【getServletContext()】 2)可以做为javaweb部分的四大域对象之一使用 3)可以获取当前项目的名称【getContextPath()】 4)可以获取文件的真实路径[getRealPath("/index.html")]5.常见异常
Throwable
算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组下标越界异常:ArrayIndexOutOfBoundsException 文件未找到异常:FileNotFoundException 操作数据库异常:SQLException6.GenericServlet
GenericServlet是个抽象类,必须给出子类才能实例化。它给出了设计servlet的一些骨架, 定义了servlet生命周期,还有一些得到名字、配置、初始化参数的方法。
7.HttpServlet
HttpServlet是子类,当然就具有GenericServlet的一切特性,还添加了doGet, doPost, doDelete, doPut, doTrace等方法对应处理http协议里的命令的请求响应过程。
8.HttpServletRequest
1)代表:代表浏览器向服务器发送的请求报文
2) 获取:由tomcat服务器创建,然后做为参数传递给我们相对应的doGet或者doPost方法! 3) 功能: getParameter()获取请求参数 getContextPath():获取当前项目名 setAttribute/getAttribute:本身就是一个域对象! request.getRequestDispatcher("1.html").forward(request,response);可以实现转发功能9.HttpServletResponse
1)代表:服务器响应给浏览器的响应报文
2)获取:由服务器创建,然后做为参数传递给我们相对应的doGet或者doPost方法! 3)功能: response.getWriter().println("<h3>helloworld!</h3>");可以返回给浏览器一个页面或者一个页面片段! response.sendRedirect("/servlet1/1.html"); :可以做请求的重定向10.转发与重定向的比较
11.乱码原因分析以及解决方案
Http协议进行通信的时候是基于请求和响应的,传输的内容我们称之为报文!
Http协议会按照一定的规则将报文编码,然后在读取的时候再使用响应的解码格式进行解码! 这个一定的规则指的就是字符集:ASCII,iso8859-1, gbk, gb2312, utf-8 编码:将字符按照字符集转化为二进制格式 解码:将二进制代码按照响应的字符集转化为字符! 乱码的根本原因:就是编码和解码指定的字符集不一致造成的! 解决方案:统一编码和解码的字符集,统一成utf-8字符集! 请求报文: 1).浏览器编码---------->服务器解码 浏览器是按照给定页面的编码格式进行编码的,所以只需要设置网页的编码格式为utf-8就可以了! get请求: 解码:使用的是tomcat默认的解码格式,默认是iso8859-1; 我们在server.xml文件中设置: <Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/> post请求: 解码:使用的是tomcat默认的解码格式,默认是iso8859-1; 在服务器端我们使用的是:req.setCharacterEncoding("utf-8");来设置解码格式 注意:req.setCharacterEncoding("utf-8")一定要设置在第一次获取请求参数之前! 2).响应编码 服务器编码------------->浏览器解码 第一种解决方案: resp.setCharacterEncoding("utf-8"); resp.setHeader("Content-Type", "text/html;charset=utf-8"); 第二种解决方案: resp.setHeader("Content-Type", "text/html;charset=utf-8"); 第三种方案: resp.setContentType("text/html;charset=utf-8");12.路径问题
路径: 虚拟路径:http://localhost:8080/servlet01/BServlet 真实路径:是指的在本地磁盘上的具体路径
相对路径:相对路径指的是相对于当前文件所在目录的路径!(具有一定的局限性) http://localhost:8080/servlet01/ http://localhost:8080/servlet01/html/a.html html/a.html 绝对路径:绝对路径是以/开头表示的 浏览器解析,/代表http://localhost:8080/【服务器的根目录】<a> 服务器解析时,/代表 http://localhost:8080/项目名/ [项目的根目录]常见的路径: ① url-pattern: ②转发的路径: 总结:这两个路径都是由服务器端解析,/代表项目的根目录 ③重定向的路径 ④页面中的路径 总结: 这两个路径都是由浏览器端解析,/代表服务器的根目录<base>标签 <!-- base标签由一个href属性,这个属性可以做为我们在页面中相对路径的前缀 也就是说:我们在当前页面中写的相对路径,它会默认以base标签中的href 属性值做为前缀, 所以base标签可以让我们以使用相对路径的方式来使用绝对路径! base标签仅仅对相对路径起作用,对绝对路径不起作用! -->