Web笔记(四)Servlet 程序开发
Servlet 的编写
Servlet本质上是一个Java类,创建一个Servlet很简单,就是定义一个Java类,这个类继承自javax.servlet.http.HttpServlet
类,覆盖其中的doGet和doPost方法,在doGet和doPost中编写处理请求的代码。
由于 Servlet 不是 Java 平台标准版的组成部分,所以必须添加jar包:servlet-api.jar
可以在Tomcat下lib目录下找到,也可自行下载添加。在创建Web项目的时候如果有选择Tomcat ,则会自动添加,如何创建一个web项目并部署到Tomcat,可以参考之前文章。
Web笔记(一) Web 简介与开发环境搭建
编写第一个Servlet ,我们可以直接在Eclipse 中的Web项目里新建Servelt。
也可以普通创建类手动继承HttpServlet。在创建完毕后需要手动重写doGet和doPost方法。
使用第一种方法新建 FirstServlet.java 类(注意看代码注释)
package net.codingme.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 第一个servlet测试
*
*/
//@WebServlet("/firstServlet")
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public FirstServlet() {
super();
}
// get请求处理
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置响应的文本类型和字符编码
response.setContentType("text/html;charset=UTF-8");
//通过输出流向客户端做出响应
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h3>firest servlet</h3>");
out.println("</body></html>");
out.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
HTTP的请求方式除了get
和post
请求之外还有put、delete等,get和post是最为常用两种请求方式,所以通常只覆盖doGet和doPost方法。
response.setContentType("text/html;charset=UTF-8");
用于设置响应的文本类型和编码方式,通过响应对象获得输出流对象out,用于向客户端浏览器输出响应内容,代码中输出的HTML标记,这实际上是一个动态的Web的页面。
关于HTTP协议的相关知识可以查看文章网络协议之HTTP
Servlet 的web.xml配置
Servlet编写完成之后,需要在工程WEBROOT/WEB-INF/web.xml
中进行配置才可以生效,web.xml是Web应用的主配置文件,包含Web应用配置的主要信息。
在web.xml中根元素<web-app>
中配置Servlet,代码如下:
<servlet>
<servlet-name>first</servlet-name>
<servlet-class>net.codingme.servlet.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>first</servlet-name>
<url-pattern>/firstServlet</url-pattern>
</servlet-mapping>
配置解释:
<servlet>
<servlet-name>servlet名</servlet-name>
<servlet-class>servlet的class的全名</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet名</servlet-name>
<url-pattern>servlet的访问路径</url-pattern>
</servlet-mapping>
Servlet 3.0的注解配置
如果Servlet版本是3.0
及以上的,可以使用@WebServlet
注解进行配置,省去了web.xml中的繁琐配置。此方式和通过web.xml配置Servlet二选一
即可。
@WebServlet主要属性列表
属性名 | 类型 | 描述 |
---|---|---|
name | String | 指定 Servlet 的 name 属性,等价于 |
value | String[] | 该属性等价于 urlPatterns 属性。两个属性不能同时使用。 |
urlPatterns | String[] | 指定一组 Servlet 的 URL 匹配模式。等价于 |
loadOnStartup | int | 指定 Servlet 的加载顺序,等价于 |
initParams | WebInitParam[] | 指定一组 Servlet 初始化参数,等价于 |
asyncSupported | boolean | 声明 Servlet 是否支持异步操作模式,等价于 |
description | String | 该 Servlet 的描述信息,等价于 |
displayName | String | 该 Servlet 的显示名,通常配合工具使用,等价于 |
@WebServlet完整的使用例子
@WebServlet(urlPatterns = {"/simple"}, asyncSupported = true,
loadOnStartup = -1, name = "SimpleServlet", displayName = "ss",
initParams = {@WebInitParam(name = "username", value = "tom")}
)
只配置访问路径的示例:
package net.codingme.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 第一个servlet测试
* 使用注解配置访问路径
*/
@WebServlet(urlPatterns= {"/firstServlet"})
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public FirstServlet() {
super();
}
.
.
.
Servlet 的运行与访问
Servlet配置完成之后,把Servlet所在工程项目部署到web服务器上并启动。
发布成功之后可以访问servlet配置的路径进行访问。
格式如:协议://服务器地址:端口号/WEB应用名/Servlet的访问路径
那么web服务器是如何找到对应的servlet类的呢?
- 查找web.xml中Servlet配置信息中的
<url-pattern>
值与请求路径相匹配的项。 - 访问到对应的(
<servlet-mapping>
中<servlet-name>
与<servlet>
中<servlet-name>
值相等,)<servlet-class>
,可以访问到指定的Servlet类。 - web服务器将在第一次访问servlet时实例化一个servlet对象用于处理请求。
访问Servlet有三种方式
- 直接在浏览器地址中输入访问路径来访问
- 通过超链接来访问
- 通过提交表单来访问
访问测试:
Servlet 的初始化参数
自定义的Servlet继承了了HttpServlet,HttpServlet继承了GenericServlet,GenericServlet类实现了ServletConfig接口,所以自定义的Servlet中可以直接使用ServletConfig中的getInitParameter(String name)
方法。也可直接通过getServletName()方法获得Servlet名字,也就是web.xml中相应的<servlet>
元素的<servlet-name>
的值。如果没有配置会返回Servlet类名。
编写Servlet
package net.codingme.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* Servlet获得初始化参数
*
* @author Niu on 2017年7月25日 下午6:14:23
*/
public class GetInitParamServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通过getInitParameter方法获得配置文件中设置的初始化值
String name = this.getInitParameter("name");
String password = this.getInitParameter("password");
//通过getServletName方法获得配置文件中设置Servlet名字
String servletName = this.getServletName();
//设置响应文本类型和编码方式
resp.setContentType("text/html;charset=UTF-8");
//通过输出流向客户端做出相应
PrintWriter out = resp.getWriter();
out.println("name:"+name);
out.println("<br>");
out.println("password:"+password);
out.println("<br>");
out.println("servletName:"+servletName);
out.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
配置Servlet
初始化了两个参数,分别是name:xy
和password:123
,访问路径/getInitParam
<!-- Servlet获取初始化参数值 -->
<servlet>
<servlet-name>getInitParam</servlet-name>
<servlet-class>net.codingme.servlet.GetInitParamServlet</servlet-class>
<!-- 初始化参数值 -->
<init-param>
<param-name>name</param-name>
<param-value>xy</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>getInitParam</servlet-name>
<url-pattern>/getInitParam</url-pattern>
</servlet-mapping>
测试Servlet
访问配置的路径:http://localhost:8080/servlet-GetInitParam/getInitParam 获取到配置的初始化参数。
GitHub:获取初始化参数
Servlet 的开发总结
Servlet开发步骤:
- 编写Servlet,编写一个Java类,继承HttpServlet类并覆盖doGet和doPost方法
- 在配置文件web.xml中配置Servlet(Servlet3.0以上版本可以使用注解)
- 将Servlet所在Java Web项目部署到Web服务器上,例如Tomcat
- 启动Web服务器
- 请求访问Servlet
Servlet执行流程:
- 客户端浏览器向Web服务器发送请求访问某一个Servlet
- Web服务器根据配置信息定位到具体的Servlet
- 如果这个Servlet是第一次被访问,此时Servlet对象在内存中不存在,则创建这个Servlet对象,如果这个Servlet已经被访问过,则Servlet的对象已经存在内存中,然后创建一个线程操作这个Servlet对象,完成具体功能。
- 获得运行结果,通过响应对象(response)设置响应参数并将结果返回到客户端。
- 客户端将相应结果显示在浏览器中。
GitHub:第一个Servlet