一、什么是Servlet
-
Servlet就是一个java类,由服务器加载运行,由服务器创建它的对象,由服务器调用它的方法
-
jsp/servlet是java语言提供的开发web应用程序的技术、规范、标准
-
在服务器端,servlet做了什么
-
接收用户请求
-
处理请求数据
-
genuine处理结果向用户响应数据
-
-
Servlet是javaweb的三大组件之一
-
三大组件:Servlet、Filter(过滤器)、listener(监听器)
-
-
关于Servlet的配置
-
url和servlet的映射关系
-
二、前后台交互的过程(自己会写)
-
用户通过浏览器输入url,请求到登录页面,这里是一个完整的请求过程
-
用户在登录页面填写用户名、密码,点击登录按钮,登录表单form中的action属性指向的url值就是处理表单数据的程序
-
用户点击登录按钮,向服务器发起登录请求
-
web服务器接收到请求后,会拿到url中最后的资源路径(实际就是action的属性值),到web.xml中找相应的url-pattern
-
找到对应的url-pattern后,根据其同标签的servlet-name,去找某个servlet标签下的servlet-name
-
找到同名的servlet-name后,服务器根据同组servlet-class加载这个servlet类
-
加载完成后实例化一个servlet对象来接收请求、处理请求、做出响应
-
三、HttpServletRequest
-
代表请求,封装所有的请求数据,其对象request由服务器创建
-
常用方法
-
设置请求数据的编码格式(get不用设置,post需要设置)
request.setCharacterEncoding("utf-8");
-
获取请求数据
-
String request.getParameter("参数的name属性值");
-
比如:String uname = request.getParameter("uname");
-
获取单个参数的value属性值
-
不论前台页面提交的是什么类型,服务器接收到的都是String类型,如果需要其他数据类型,需要进行数据类型转换
-
-
String[] request.getParameterValues("一组同名参数的name属性")
-
比如:String[] hobbys = request.getParameterValues("hobby");
-
获取一组同名的参数的value属性值,返回值是String数组
-
-
-
获取请求方式
request.getMethod();
-
判断请求方式是GET还是POST
-
-
四、HttpServletResponse
-
代表相应,封装了所有的响应数据,其对象response由服务器创建
-
常用方法
-
设置响应数据的编码格式
response.setContentType("text/html;charset=utf-8");
-
告诉浏览器响应的文档是html,编码格式是utf-8
-
-
获取输出流
PrintWrite pw = response.getWriter(); //print()方法可以输出对象 pw.print(new Date()); pw.print("<h1>hello</h1>"); //write()方法不能输出对象 pw.write(new Date());//编译错误 pw.flush(); pw.close();
-
五、创建servlet的三种方式
-
实现Servlet接口
public class HelloServlet implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("Servlet被创建初始化"); } @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("servlet提供服务"); } @Override public String getServletInfo() { return null; } @Override public void destroy() { System.out.println("servlet被销毁"); } }
-
在Servlet接口中定义了servlet生命周期方法
-
init():
-
servlet初始化方法
-
在第一次访问servlet时,servlett才会被初始化
-
一个servlet只能被初始化一次,就像一个人只出生一次
-
-
service():
-
servlet提供服务的方法,即接受请求、处理请求、做出响应的方法,可以接收任意方式的请求
-
可以被调用多次
-
-
destroy():
-
servlet销毁方法
-
在web服务器关闭时调用,只能调用一次,就像一个人只死亡一次
-
-
-
servlet的出生
-
默认情况下,服务器会在servlet第一次被请求时,加载它,创建它的对象,而且一生只实例化一个对象
-
比如:我们首次访问http://localhost:8080/hello时,服务器会根据url后的"/hello"在web.xml中找到与之对应的com.jxd.servlet.HelloServlet,然后创建它的对象,当我们第二次访问http://localhost:8080/hello时,服务器不会再创建它的对象,而是直接使用上次创建的对象
-
在servlet对象被创建后,服务器会马上调用servlet的init()方法进行初始化,一个servlet的一生该方法只会被调用一次,我们可以把servlet的一些初始化方法放在init()中
-
设置servlet随着服务器的启动而被创建
<servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.jxd.servlet.HelloServlet</servlet-class> <!--设置servlet随着服务器的启动而被加载,里面的值为非负数,0的优先级最高--> <load-on-startup>0</load-on-startup> </servlet>
-
一般不这样设置,因为这样会增加服务器的启动压力,服务器启动时需要加载的项过多
-
-
servlet的销毁
-
servlet不会轻易销毁,通常在关闭服务器的时候,servlet才会销毁
-
服务器关闭时会调用destroy()方法,我们可以把servlet的临终遗言放在destroy()中,比如对某些资源的释放等代码可以放在destroy()中
-
-
总结servlet的生命周期(重要)
-
在第一次请求servlet时,服务器会创建它的对象,然后执行init()方法进行初始化,init()方法只能被调用一次,然后执行service方法提供服务
-
再次访问servlet时,只会调用service()方法,该方法可以被调用多次
-
在web服务器关闭时,会调用destroy()方法销毁servlet
-
-
-
继承GenericServlet
-
该类实现了Servlet接口,只需要重写service方法提供服务即可
-
-
继承HttpServlet 比较常用的方式
六、ServletConfig接口
-
servlet的配置信息
-
init(ServletConfig servletConfig)
-
在web.xml中为servlet配置一些初始化参数
<servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.jxd.servlet.HelloServlet</servlet-class> <!--为当前servlet添加初始化参数,只对当前servlet生效--> <init-param> <param-name>param1</param-name> <param-value>utf-8</param-value> </init-param> </servlet>
-
当我们首次访问servlet时,web服务器会根据url找到相应的servlet,服务器在创建servlet对象时,会将servlet的配置信息(servlet的名字、初始化信息等等)封装到ServletConfig对象中,在调用init()方法时,会将ServletConfig对象传递给它,进而,我们可以通过ServletConfig对象获取到该Servlet的配置信息
//获取servlet的初始化参数 String param1 = servletConfig.getInitParameter("param1"); System.out.println("param1的value是:" + param1); //获取servlet的别名 String servletName = servletConfig.getServletName(); System.out.println("servlet的名字是:" + servletName);
-
ServletConfig代表servlet的配置信息,对应的是web.xml中的<servlet></servlet>标签
-
获取ServletConfig对象
-
实现了Servlet接口的Servlet类
-
在init(ServletConfig servletConfig)方法中,直接使用
-
-
继承了HttpServlet的servlet类
-
在doPost()或doGet()方法中通过this获取ServletConfig对象
ServletConfig servletConfig = this.getServletConfig();
-
-
七、ServletContext接口
-
设置全局变量
<!--设置全局参数--> <context-param> <param-name>uname</param-name> <param-value>admin</param-value> </context-param>
-
获取全局初始化参数
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取ServletContext对象 ServletContext servletContext = this.getServletContext(); String uname = servletContext.getInitParameter("uname"); System.out.println(uname); ServletConfig servletConfig = this.getServletConfig(); }
-
ServletContext在web服务器启动时就创建,在web服务器关闭时才销毁,和服务器同生共死
-
放在该对象中的数据,会被此web应用的所有资源共享
-
常用方法
-
获取ServletContext对象
//获取ServletContext对象 ServletContext servletContext = this.getServletContext();
-
获取web.xml中设置的全局变量
String uname = servletContext.getInitParameter("uname");
-
往ServletContext对象中存放数据
-
//往ServletContext中存放数据 servletContext.setAttribute("msg","ServletContext");
-
获取ServletContext对象中的数据,因为存进去的都是Object类型,所以获取到的也是Object类型,需要其他类型需要进行类型转换
-
//获取ServletContext中的参数 String msg = (String) servletContext.getAttribute("msg"); System.out.println("msg对应的信息是:" + msg);
-