java servlet,运行在web容器(比如tomcat,就是一个Web应用服务器,是一个Servlet容器)中运行的java应用程序,处理请求HttpServletRequest和发送响应HttpServletResponse,即处理用户在B端(浏览器端)发出的请求到S端(服务器端),服务器端把处理的结果发送响应到B端。
一、servlet简单配置和使用
编写servlet.java
package com.cn.servlet; import java.io.IOException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * @author cfang * 2018年5月29日 下午4:49:37 * * 生命周期 :web容器反射实例化newInstance -> 初始化init -> service方法分发 -> doGet/doPost -> 销毁destroy */ public class MyServlet extends HttpServlet{ public MyServlet(){ System.out.println("实例化MyServlet"); } @Override public void init() throws ServletException { System.out.println("init"); super.init(); } /** * 请求统一转发器,功能类似springmvc的dispatchservlet * 接收所有请求,然后根据post、get请求,分发到具体的doGet或者doPost方法上。 * HttpServlet中具体实现,根据req.getMethod()获取请求方法,再比较是GET还是POST。 */ @Override protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException { //to do something。。。 //交给父类方法处理分发 super.service(arg0, arg1); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doGet"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doPost"); } /** * servlet销毁触发 */ @Override public void destroy() { System.out.println("destroy servlet"); super.destroy(); } }
配置web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <!-- servlet配置 --> <servlet> <!-- servlet别名,随便取,一般取跟类名相同 --> <servlet-name>myServlet</servlet-name> <!-- 将类的实例化操作交给web服务器(如tomcat)去实现 --> <!-- web容器去反射实例化servlet, Class.forName("com.cn.servlet.MyServlet").newInstance() --> <servlet-class>com.cn.servlet.MyServlet</servlet-class> <init-param> <!-- 这里可以放置初始化参数 --> <param-name>test</param-name> <param-value>test init param</param-value> </init-param> <!-- 标记是否在容器启动的时候,加载这个servlet --> <!-- 当 大于等于0的时候,表示容器启动时就加载并初始化servlet。正数的值越小,优先级越高,应用启动时优先加载--> <!-- 当未设置或者负数的时候,则是在第一次调用该servlet的时候才去加载 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <!-- 和上面定义的servlet-name一致 --> <servlet-name>myServlet</servlet-name> <!-- servlet拦截路径,也就是浏览器通过这个配置的url规则找到对应处理的servlet --> <!-- "/"表示拦截所有请求, "/xxx"表示只拦截xxx的请求 --> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
二、servlet生命周期
web服务器启动时,根据配置的load-on-startup信息,决定是否加载或者是在第一次调用的时候再加载,初始化。
接收处理请求,执行service方法,分发请求到具体doGet/doPost中处理并返回客户端数据。
服务器关闭,销毁servlet对象,执行destroy方法。
三、几个重点对象
1、ServletConfig
获取 : getServletConfig()
方法说明: getServletName(); //获取servlet的名称,也就是我们在web.xml中配置的servlet-name
getServletContext; //获取ServletContext对象,该对象的作用看 2 中
getInitParameter(String); //获取在servlet中初始化参数的值。这里注意与全局初始化参数的区分。这个获取的只是在该servlet下的初始化参数
getInitParameterNames(); //获取在Servlet中所有初始化参数的名字,也就是key值,可以通过key值,来找到各个初始化参数的value值。注意返回的是枚举类型
2、ServletContext
获取:getServletContext()、getServletConfig().getServletContext();
方法说明:一个web容器中,每个项目中,ServletContext实例只会有一份。
存放、共享数据:Object getAttribute(String name)、void setAttribute(String name, Object object)、void removeAttribute(String name)。
获取初始化参数:String getInitParameter(String name)、Enumeration getInitParameterNames()
获取web项目指定资源路径:String getRealPath(String path),会输出绝对路径。
3、request/response
3.1、request能获得请求文本中的所有内容:请求头、请求体、请求行 。还可请求的转发request.getRequestDispatcher(String path).forward(request,response);
path:转发后跳转的页面,这里不管用不用"/"开头,都是以web项目根开始,因为这是请求转发,请求转发只局限与在同一个web项目下使用,
所以这里一直都是从web项目根下开始的。
3.2、response
response.setHeader(java.lang.String name, java.lang.String value)设置头信息
手动重定向:
response.setStatus(302); //状态码302就代表重定向
response.setHeader("location","http://www.baidu.com");
封装的方法:
response.sendRedirect("http://www.baidu.com");
特点:服务器告诉浏览器要跳转的页面,浏览器主动去跳转的页面,浏览器的地址栏中url会变,
是浏览器重新发起一个请求到另外一个页面,所以request是重新发起的,跟请求转发不一样。
注意:response.sendRedirect(path); //
第一种:response.sendRedirect("/test01/MyServlet01"); //使用了"/"开头,说明是从web站点根开始,所以需要写test01/MyServlet01
第二种:response.sendRedirect("MyServlet01"); //没有使用"/"开头,说明是从web项目根开始,那么就无需写test01了。
重定向没有任何局限,可以重定向web项目内的任何路径,也可以访问别的web项目中的路径,并且这里就用"/"区分开来,如果使用了"/"开头,
就说明我要重新开始定位了,不访问刚才的web项目,自己写项目名,如果没有使用"/"开始,那么就知道是访问刚才那个web项目下的servlet,就可以省略项目名了。
下篇继续解决request、response的中文乱码问题。。