5 Servlet
2018-02-11 18:50
134 查看
1.Servlet就是接口
2.第一个servlet程序
3.Servlet的生命周期
```servlet生命周期方法:
init(ServletConfig config):初始化方法,获取初始化参数配置
service(ServletRequest req,ServletResponse res):服务方法,用户浏览
每次请求都会执行此方法,所有的业务逻辑全部在此方法完成
destory();servlet的销毁方法
Servlet生命周期执行流程:
创建servlet对象-->init方法-->Service方法-->destory方法(服务器关闭才执行)
2.第一个servlet程序
拷贝servlet-api.jar 定义一个servlet类实现servlet接口 关联源代码 apche-tomcat-7.0.57-src.zip 配置web.xml文件,使servlet可以在tomcat运行 <servlet> <servlet-name>HelloServlet</servlet-name> <!--全限定名--> <servlet-class>cn.wjw.servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <!--资源名称--> <url-pattern>/hello</url-pattern> </servlet-mapping> 其中url-pattern是资源名称
<?xml version="1.0" encoding="utf-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="false"> <servlet> <servlet-name>MappingServlet</servlet-name> <servlet-class>org.fkjava._01_.mapping.MappingServlet</servlet-class> <!-- load-on-startup 如果小于0 init方法不会随着tomcat启动而执行 load-on-startup 默认值是 -1 load-on-startup 如果大于0 init方法就会随着tomcat启动而执行 值的范围 0-5 ,数值越大,优先级越高 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>MappingServlet</servlet-name> <url-pattern>/student/mapping</url-pattern> </servlet-mapping> </web-app>
3.Servlet的生命周期
```servlet生命周期方法:
init(ServletConfig config):初始化方法,获取初始化参数配置
service(ServletRequest req,ServletResponse res):服务方法,用户浏览
每次请求都会执行此方法,所有的业务逻辑全部在此方法完成
destory();servlet的销毁方法
Servlet生命周期执行流程:
创建servlet对象-->init方法-->Service方法-->destory方法(服务器关闭才执行)
**4.Servlet请求流程** 解析url请求-->在tomcat的conf/server.xml文件找上下文路径,找到项目根路径-->项目根路径的WEB-INF下找web.xml文件中的资源名称url-pattern,找到对应类 -->第一次请求访问创建servlet对象,非第一次访问从tomcat缓存池获取servlet对象 -->第一次访问执行init方法-->每次访问都会执行service方法--->响应浏览器一个html``` 将init方法执行的时机放到tomcat启动的时候执行,在<servlet>配置一个子元素: <load-on-startup>1</load-on-startup> **5.Servlet初始化参数** web.xml中初始化参数配置; <servlet> <init-param> <param-name>encoding</param-name> <param-value>GBK</param-value> </init-param> </servlet> ServletConfig读取初始化参数的方法: getInitParameter(""):获取指定名称的初始化参数 **6.Servlet的继承体系** 自定义的servlet-->HttpServlet-->GenericServlet实现Servlet和ServletConfig接口 重写父类init方法的两种方式: 重写有参数的init方法,必须调用父类init方法 重写无参数的init方法(推荐) 执行业务的三种方法: doGet方法中调用doPost方法,让doPost方法执行业务 doPost方法中调用doGet方法,让doGet方法执行业务 直接使用service方法(推荐) **7.HttpServiceRequest常用方法** getContextPath():获取当前应用的上下文路径 getParameter(""):获取请求参数 **8. 解决中文乱码问题;** 为什么Servlet接收中文会乱码? Tomcat默认使用ISO-8859-1编码,单字节编码,不支持中文 解决乱码的三种方式: 1.针对GET和POST都有效: 先将接收的字符串-ISO-8859-1转成字节数组: getBytes("ISO-8859-1"); 再将字节数组-UTF-8的编码转成字符串: new String(data,"UTF-8"); 2.只对POST有效 req.setCharacterEoding("utf-8"); 3.只对GET有效: server.xml中71行添加属性URIEnoding="UTF-8" **9.HttpServletResponse常用方法** getWriter():返回字符打印流,向浏览器打印 getOutputStream():获取字节输出流,用于文件下载 设置响应编码: resp.setCharacterEncoding("utf-8"); 设置响应的MIME类型: resp.setContentType("text/html"); 合二为一的方法: resp.setContentType("text/html;charset=utf-8"); public class ResponseServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 获取字节输出流:用于下载文件 //ServletOutputStream outputStream = resp.getOutputStream(); //设置响应编码 //resp.setCharacterEncoding("utf-8"); //设置响应的MIME类型 //resp.setContentType("text/html"); //和二为一的方法 resp.setContentType("text/html;charset=utf-8"); // 获取字符打印流 PrintWriter out = resp.getWriter(); out.print("<html>"); out.println("<head>"); out.println("<title>"); out.println("我是title"); out.println("</title>"); out.println("</head>"); out.println("<body>"); out.println("我是内容"); out.println("</body>"); out.print("</html>"); //Servlet不擅长响应数据,使用JSP(期待) } **10.Servlet的注解配置** 不忽略servlet的注解:修改web.xml根元素的属性metadata-complete="false" @WebServlet("/anno") @WebServlet(name="AnnoServlet",urlPatterns={"/anno","/anno1"},loadOnStartup=1, initParams={@WebInitParam(name="encoding",value="GBK")} ) public class AnnoServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override public void init() throws ServletException { System.out.println(super.getInitParameter("encoding")); System.out.println("注解配置的初始化方法执行了"); } @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("我是注解配置的servlet"); } } **11.Servlet线程安全问题(selvet对象只有一个)** 造成多线程并发数据不安全的原因:多个线程同时操作一份数据 解决方案:不使用成员变量,使用局部变量
相关文章推荐
- 深入理解Servlet [转]
- Wrapper cannot find servlet class DepServlet or a class it depends on
- 简单实现Servlet文件下载功能
- 后台如何向前端传递JSON数据(Servlet传向jsp页面)
- 修改MyEclipse8.6中的Servlet.java模板
- JSP-Servlet实现网上BBS项目小案例
- 用连接池提高Servlet访问数据库的效率(2)
- ServletConfig和ServletContext
- Servlet的几种跳转(redirect、forward)
- Servlet3.0新特性
- 基于servlet的文件下载
- multipartFile 出错:Expected MultipartHttpServletRequest: is a MultipartResolver configured?
- Servlet基础学习一
- servlet原理--Tomcat与Servlet如何解耦
- 10月17日Servlet培训日记
- Servlet中的细节
- 解决Allocate exception for servlet jsp的问题
- servlet的转发与重定向
- Servlet 包装器-21
- 在Servlet中,获得src下面包中文件的路径的方法