Servlet简介与Servlet和HttpServlet运行的流程
2017-06-06 10:55
609 查看
1.Servlet
[1] Servlet简介
> Server + let
> 意为:运行在服务器端的小程序。
> Servlet实际上就是一个接口。
- 狭义上的Servlet,指的就是Servlet接口
- 广义上的我们认为凡是实现Servlet接口的类,我们都称他是一个Servlet *****
> Servlet的作用:
1.接收用户发送的请求
2.调用其他的java程序来处理请求
3.根据处理结果,返回给用户一个页面
[10]运行的流程
[11]HttpServlet
[1] Servlet简介
> Server + let
> 意为:运行在服务器端的小程序。
> Servlet实际上就是一个接口。
- 狭义上的Servlet,指的就是Servlet接口
- 广义上的我们认为凡是实现Servlet接口的类,我们都称他是一个Servlet *****
> Servlet的作用:
1.接收用户发送的请求
2.调用其他的java程序来处理请求
3.根据处理结果,返回给用户一个页面
> Servlet的HelloWorld 1.创建一个类并实现Servlet接口 2.在web.xml文件中对Servlet进行配置 <servlet> <servlet-name>别名</servlet-name> <servlet-class>全类名</servlet-class> </servlet> <servlet-mapping> <servlet-name>别名</servlet-name> <url-pattern>需要servlet处理的请求地址</url-pattern> </servlet-mapping> > Servlet的三个名字: <servlet-name> - Servlet的别名,程序员通过别名对Servlet进行配置 <servlet-class> - Servlet的全类名,服务器通过全类名来创建Servlet的实例 <url-pattern> - Servlet映射的请求地址,用户通过该地址访问Servlet [2] Servlet的生命周期 > Servlet的生命周期,指Servlet的对象从被创建到被销毁的过程。 > Servlet的生命周期方法: 1.构造器: - Servlet第一次处理请求时,会调用构造器,来创建Servlet实例。 - 只会调用一次,Servlet是单例模式,他是以多线程的方式调用service()方法. - Servlet不是线程安全,所以尽量不要再service()方法中操作全局变量。 2.init()方法: - 构造器调用之后马上被调用,用来初始化Servlet,只会调用一次。 3.service()方法: - Servlet每次处理请求时都会调用service()方法,用来处理请求,会调用多次。 4.destroy()方法: - Servlet对象销毁前(WEB项目卸载时)调用,用来做一些收尾工作,释放资源。 [3] 相关接口 ①ServletConfig 代表:当前Servlet的配置信息,每一个Servlet都有其唯一对应的ServletConfig。 <servlet> <servlet-name>AServlet</servlet-name> <servlet-class>com.atguigu.servlet.AServlet</servlet-class> <init-param> <param-name>user</param-name> <param-value>root</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>123123</param-value> </init-param> </servlet> 获取:由Tomcat服务器创建,最终作为参数传递到init()方法中,我们可以在init()方法直接使用。 当我们通过继承HttpServlet创建Servlet时,由于父类已经实现ServletConfig接口, 所以我们可以在Servlet中直接调用ServletConfig的方法。 功能: 【1】 获取Servlet的别名 【2】 获取当前Servlet的初始化参数。 <init-param> <param-name>user</param-name> <param-value>root</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>123123</param-value> </init-param> 【3】 获取当前WEB应用的ServletContext对象。 ②ServletContext 代表:当前的WEB应用,一个WEB应用对应一个唯一的ServletContext对象, ServletContext对象在项目启动时创建,在项目卸载时销毁。 获取:通过ServletConfig的getServletContext()方法获取。 功能: 【1】 可以获取整个WEB应用的初始化参数 <context-param> <param-name>phone</param-name> <param-value>1388888888</param-value> </context-param> 【2】 可以获取资源的真实路径(物理路径),主要在文件的上传和下载时使用。 【3】 可以作为一个域对象在不同的web资源之间共享数据。(下回分解) [4] GenericServlet - 通用Servlet的父类 - 相比Servlet接口GenericServlet更加简单一些,但是我们最终实际上使用的HttpServlet [5] HttpServlet - HttpServlet继承了GenericServlet,而GenericServlet实现Servlet接口 - 所以我们可以同构继承HttpServlet来创建一个Servlet。 - HttpServlet重写service()方法: 1.在该方法中先将ServletRequest和ServletResponse 强转为了HttpServletRequest和HttpServletResponse。 2.然调用重载的service()方法,并将刚刚强转得到对象传递到重载的方法中。 - 重载service(HttpServletRequest request , HttpServletResponse response) 1.在方法中获取请求的方式(get或post) 2.在根据不同的请求方式去调用不同的方法: 如果是GET请求,则调用doGet(HttpServletRequest request , HttpServletResponse response) 如果是post请求,则调用doPost(HttpServletRequest request , HttpServletResponse response) - 结论: 当通过继承HttpServlet来创建一个Servlet时,我们只需要根据要处理的请求的类型,来重写不同的方法。 处理get请求,则重写doGet() 处理post请求,则重写doPost() [6] HttpServletRequest 代表:浏览器发送给服务器的请求报文。 获取:该对象由Tomcat服务器创建,最终作为参数传递到doGet或doPost方法中,我们可以在这两个方法中直接使用。 功能: 【1】获取用户发送的请求参数 request.getParameter("username"); 【2】获取项目的名字(用来设置绝对路径) request.getContextPath(); 【3】作为一个域对象,在不同的WEB资源之间共享数据。 【4】请求的转发 request.getRequestDispatcher("target.html").forward(request, response); [7] HttpServletResponse 代表:服务器发送给浏览器的响应报文。 获取:该对象由Tomcat服务器创建,最终作为参数传递到doGet或doPost方法中,我们可以在这两个方法中直接使用。 功能: 【1】响应给浏览器一个网页或者是网页片段(设置的是响应报文的响应体) response.getWriter(""); 【2】请求的重定向 response.sendRedirect("target.html"); 转发和重定向:(掌握) 转发 重定向 请求的次数: 1 2 发生的位置 服务器内部 浏览器 浏览器地址栏 不改变 改变 浏览器的感知 不知道 知道 [8] 字符编码 > 当用户通过表单向Servlet发送中文请求参数时,Servlet获取到内容会产生乱码, 当Servlet向浏览器响应中文内容时,也会产生乱码。 > 浏览器和服务器之间通信时,中文内容时不能直接发送的,需要对中文进行编码。 > 编码: - 将字符转换为二进制码的过程叫编码。 > 解码: - 将二进制码转换为普通字符的过程叫解码。 > 编码和解码所采用的规则我们称为字符集。 > 产生乱码问题的根本原因: 编码和解码所采用的字符集不同。 > 解决方法: 统一编码和解码的字符集为UTF-8。 > 常见字符集: 1.ASCII 2.ISO8859-1 3.GBK 4.GB2312 5.UTF-8 > 请求编码 - 请求是浏览器发送给服务器的。 - 浏览器 --> 服务器 - 浏览器 编码 > 浏览器的会自动使用网页的字符集对参数进行编码 UTF-8的张三:%E5%BC%A0%E4%B8%89 GBK的张三:%D5%C5%C8%FD > 所以我们只需要统一网页的字符集为UTF-8即可。 - 服务器 解码 post请求 > request解码时默认字符集时iso8859-1,但是iso压根就不支持中文 > post请求在servlet中解码,所以我们只需要指定request的字符集即可。 > 我们可以通过如下方法,来设置request的字符集: request.setCharacterEncoding("utf-8"); > 注意: 该方法要在request.getParameter()第一次调用之前调用 get请求 > get请求是通过url地址传递请求参数,url中的请求参数将会被Tomcat服务器自动解码。 > Tomcat的默认编码是iso8859-1,但是iso压根就不支持中文,所以必然乱码。 > 只需要修改Tomcat的解码的默认字符集,修改配置文件server.xml > 在server.xml的Connector标签中(改端口号的那个标签)添加如下属性: URIEncoding="utf-8" > 修改完配置文件以后,get请求的编码就不用再处理的,但是post请求还是老样子。 > 响应编码 - 响应是服务器发送给浏览器 - 服务器 --> 浏览器 - 服务器 编码 > 指定服务器的编码字符集为UTF-8。 > 指定response的字符集 response.setCharacterEncoding("utf-8"); > 虽然我们已经指定了response的字符集为utf-8,但是浏览器并不是用utf-8解码。 浏览器默认使用gb2312解码的,所以依然乱码,只不过没有那么乱。 - 浏览器 解码 > 浏览器的解码字符集可以通过浏览器来设置(不靠谱) > 我们可以通过服务器来告诉浏览器,我们的内容的编码格式为utf-8 > 我们可以通过一个响应头来告诉浏览器,内容的编码格式: Content-Type:text/html;charset=utf-8 > 通过response的方法,来设置响应头: response.setHeader("Content-Type", "text/html;charset=utf-8"); 解决方案: 1.设置响应头 response.setHeader("Content-Type", "text/html;charset=utf-8"); 2.设置response的编码格式 response.setCharacterEncoding("utf-8"); > 当我们设置Content-Type这个响应头时,服务器会自动使用响应头中的字符集为内容编码。 > 最终方案: response.setContentType("text/html;charset=utf-8"); 总结: post请求: - 在request.getParameter()方法第一次调用之前,调用如下代码: request.setCharacterEncoding("utf-8"); get请求: - 修改server.xml配置文件 - <Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/> 响应: - 设置一个Content-Type响应头 response.setContentType("text/html;charset=utf-8"); [9] 路径问题 > URI和URL - URL是URI的一种实现,也是URI最常见的实现方式。 - URI有两种实现方式URL和URN,URN用的很少 - 我们说URL和URI实际上可以理解为一个意思 > URL地址的格式 http://主机名:端口号/项目名/资源路径/资源名 ①相对路径和绝对路径 > 相对路径 - 之前我们使用的路径全都是相对路径: - 所谓的相对路径指相对于当前资源所在路径: http://主机名:端口号/项目名/资源路径/ - 由于转发的出现,相对路径会经常发生变化,容易出现错误的链接 所以在开发中我们一般不使用相对路径,而是使用绝对路径。 > 绝对路径 - 绝对路径使用/开头 - 由浏览器解析的绝对路径中的/代表的是服务器的根目录: http://主机名:端口号/ 注意:需要加上项目名 - 由服务器解析的绝对路径中的/代表的项目的根目录: http://主机名:端口号/项目名/ 注意:不要加项目名 - 转发的路径由服务器解析,设置绝对路径时不需要加项目名 - 重定向的路径由浏览器解析,设置绝对路径时需要加上项目名 ②常见的路径: url-pattern: 转发的路径: - url-pattern和转发中的路径都是由服务器解析的, 根目录是项目的根目录: http://主机名:端口号/项目名/ - 所以这两个路径不需要加项目名 重定向的路径: 页面中的路径: - 重定向和页面中的路径(HTML标签中的路径),由浏览器解析的, 根目录是服务器的根目录: http://主机名:端口号/ - 所以这个两个路径必须加上项目名
[10]运行的流程
[11]HttpServlet
相关文章推荐
- Servlet简介与Servlet和HttpServlet运行的流程
- Servlet简介与Servlet和HttpServlet运行的流程
- Servlet运行周期与原理流程
- Servlet运行周期与原理流程
- Servlet运行流程
- Struts2框架的运行原理,以及开发流程,和数据库MylSAM引擎的简介
- servlet运行流程
- Servlet运行周期与原理流程
- Servlet应用的运行流程
- Servlet 简介及其执行流程
- Servlet运行周期与原理流程
- servlet的简介及运行
- servlet的web.xml配置有什么意义,运行时是什么流程?
- 【转】WinForm 程序的运行框架与启动流程简介(图文)
- 分析基于Jsp+Servlet+JavaBean的个人信息管理系统的运行流程
- WinForm 程序的运行框架与启动流程简介(图文)
- (四)Thinkphp运行流程简介-TTLSA
- servlet运行流程
- Apache APR可移植运行库简介(1)
- Servlet和JSP的协调运行——通过调整Servlet和JSP来提高你的企业应用的运行性能