1. Servlet简介
Servlet是JavaEE的规范之一,也就是属于一个接口,一个需要实现的接口;
Servlet是Javaweb的三大组件之一,分别是Servlet程序,Filter过滤器,Listener监听器;
Servlet是在服务器端运行的Java程序,并且能够接受客户端发送的请求,还能响应数据给客户端;(就是说属于服务端的代码)
Servlet不是线程安全的;
2. 手动实现Servlet方法
第一步: 实现一个继承Servlet接口的类;
第二步: 实现service方法,处理请求,并响应数据;
**第三步:**到web.xml中去配置servlet程序访问的位置;(但是目前的servlet版本已经是3.0了,可以直接通过注解进行配置了,也就是不再需要去XML里面单独配置了);不过这里对简单的配置还是进行一下记录,以下是在web.xml文件中对Servlet文件进行配置的方法;
包的安放位置:
<servlet>
<!--第一个是自己设置的名字,随便设置 -->
<servlet-name>FirstServlet</servlet-name>
<!--这个是设置Servlet的位置,资源详细位置-->
<servlet-class>cn.dxs.Servlet.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<!--这里的名字要和前面的一致-->
<servlet-name>FirstServlet</servlet-name>
<!--这里必须要有一条 / 否则会报异常,主要表示的是一个地址例如:http://ip:端口号/工程路径/first
工程路径可以在Tomcat中设置;
-->
<url-pattern>/first</url-pattern>
</servlet-mapping>
web.xml配置文件中,先加载<url-pattern>中的资源路径,然后找到<servlet-mapping>标签中的<servlet-name>,通过这个<servlet-name>找到 <servlet>中的<servlet-name>,最后找到 <servlet-class>中的对应位置;
如果<url-pattern>标签中的内容没有加/,在启动Tomcat的时候,就会报如下的错误;
3.Servlet的生命周期
- 执行Servlet的构造器方法;(只执行一次,目前一般不写)
- 执行init方法;(只执行一次)
- 执行service方法;(可以多次执行,处理客户端请求,响应客户端)
- 执行destroy方法; (停止Tomcat服务器时可以执行)
一般实际使用中很少直接去实现Servlet方法,创建Servlet,一般都是直接继承HttpServlet类来实现Servlet程序;
- 在创建servlet之后,就需要进行请求的分发,一下是HttpServlet类重写的Servlet方法(源码);
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
//定义两个空的类型引用;
HttpServletRequest request;
HttpServletResponse response;
try {
//在这里对传进来的ServletRequest参数进行强制类型转换;
request = (HttpServletRequest)req;
response = (HttpServletResponse)res;
} catch (ClassCastException var6) {
throw new ServletException(lStrings.getString("http.non_http"));
}
//调用重载的另外一个service方法
this.service(request, response);
}
}
这个源码就是上面所说的重载了的方法; 下面做简单的记录;
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通过getMethod()方法,获得表单传递时的方法名;
String method = req.getMethod();
long lastModified;
//然后就是开始判断,**方法就掉用do**()方法;
if (method.equals("GET")) {
lastModified = this.getLastModified(req);
if (lastModified == -1L) {
this.doGet(req, resp);
} else {
long ifModifiedSince;
try {
ifModifiedSince = req.getDateHeader("If-Modified-Since");
} catch (IllegalArgumentException var9) {
ifModifiedSince = -1L;
}
if (ifModifiedSince < lastModified / 1000L * 1000L) {
this.maybeSetLastModified(resp, lastModified);
this.doGet(req, resp);
} else {
resp.setStatus(304);
}
}
} else if (method.equals("HEAD")) {
lastModified = this.getLastModified(req);
this.maybeSetLastModified(resp, lastModified);
this.doHead(req, resp);
} else if (method.equals("POST")) {
this.doPost(req, resp);
} else if (method.equals("PUT")) {
this.doPut(req, resp);
} else if (method.equals("DELETE")) {
this.doDelete(req, resp);
} else if (method.equals("OPTIONS")) {
this.doOptions(req, resp);
} else if (method.equals("TRACE")) {
this.doTrace(req, resp);
} else {
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[]{method};
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(501, errMsg);
}
//基本逻辑就是这样;
}
4. ServletConfig类记录
- Servlet和ServletConfig都是由Tomcat创建;
- Servlet程序默认是在第一次访问的时候创建,而ServletConfig则是在其创建的同时创建一个对应的对象;
- 这个类可以获得初始化参数<init-param>(前提是已经设置了这么一个标签),这是一个类似于键值对的参数;
以下所有的结果都是按照上面的XML配置文件显示的;
<init-param>
<!--在<servlet>标签中设置<init-param>标签,这个标签存放的是键值对;-->
<param-name>/name</param-name>
<param-value>/dxs</param-value>
</init-param>
4. 这个类还可以获得程序的别名,也就是自己设置的<servlet-name>;
结果是:
- 这个类还可以获得ServletContext对象;
- 如果类继承了一个HttpServlet类,那么在这里面的doPost/doGet方法中,可以使用getServletConfig()方法获得一个ServletContext对象;但是必须要重写init()方法,才能够得到一个非空对象,按如下格式重写init()方法;
然后在具体的方法中可以这么写:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//先获得ServletConfig对象,然后就可以通过这个对象调用相应的方法了;
ServletConfig servletConfig = getServletConfig();
System.out.println(servletConfig.getServletName());
}
除此之外,还需要再XML中单独创建属于这个类自己的Severlet标签和servlet-mapping标签;如果直接注解也都可以设置,像什么initparam、name、value等;
Java杂记
1. 在web中重定向(sendRedirect)需要服务器响应两次;但是转发(forword)只是响应一次;
2. http的请求方法:GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS,CONNECT,PATCH;
请求的方法 | 基本介绍 |
GET | 该方法传输数据长度有限制,且不安全,但是单纯的申请资源时不会对服务器产出影响,可主要用于接收数据; |
POST | 该方法主要可用于传输数据,传输数据无限制,且安全; |
HEAD | 该方法与Get类似,但是服务器要返回头部信息; |
PUT | 该方法简单来说就是更新一些数据; |
DELETE | 该方法用于删除某些资源,并且可以返回状态码,分别是200(删除,返回资源),202(将要删除数据放于待删除区),204(已经删除,无返回资源,或资源不存在) |
PATCH | 对部分资源进行修改 |
上面的方法中最常使用的,目前还是get和post;
3.在查看各种请求方法的时候,发现了所谓的名词“幂等”,意思就是发送一次和多次请求引起的边界效应是一样的,(就像是get方法中,直接从服务器获取到的数据就是一样的);post由于用于上传数据,所以可能接收到不同的的回传数据,导致它是“不幂等”的;
4. ServletContext是一个接口,一个web只有一个ServletContext对象实例,它是域对象(像Map一样存取数据,键值对),这种域对象的主要的方法有存放(setAttribute()方法),取数据(getAttribute()),移除数据(removeAttribute());
5. 通过 getServletConfig().getServletContext();创建ServletContext对象;