对于Java开发人员来说,应该已经习惯了应用spring框架中的注解方式来提供接口,本人就是这种。不过最近由于工作需要,要开发纯Java项目,不使用任何框架,那就只能使用servlet来达到提供接口的目的了,顺便复习一下。
Servlet是 Java用来创建动态web应用的服务组件,可以被部署在Java web服务器中,例如:Tomcat,JBoss,WebLogic等主流服务器中。Servlet可以对用户的请求做出响应。
它的功能如下:
- 读取客户端发来的显示信息(表单数据)
- 读取客户端发来的隐式信息(请求头信息)
- 生成相应结果
- 发送显示信息给客户端(HTML)
- 发送隐式数据到客户端(状态码和响应头信息)
由于servlet一般是和JSP配合开发,但这里重点是介绍servlet如何提供接口,所以这里不会进行JSP的开发。由于希望不改变前端的调用方式,则servlet获取参数的部分会和配合jsp获取参数的方式有一点区别,其他的就没有了,该干嘛干嘛。
最后的小demo,可以点击文末链接下载。
现在开始这个过程吧。
1,eclipse中新建一个动态web项目,命名为OrdinaryWorldServletDemo。
2,引入jar包,包括servlet-api.jar,dubbo-2.5.3.jar,fastjson-1.2.47.jar。
其中servlet-api.jar在tomcat的lib目录下,提供servlet基本依赖,引入即可(没有安装tomcat请先安装,因为我们待会要使用tomcat来跑这个servlet项目)。
3,新建一个po类。
package com.twf.demo.po;
import java.io.Serializable;
/**
* 人物信息
* @author twf
*
*/
public class CharacterInfo implements Serializable{
private static final long serialVersionUID = -3468076463472476354L;
private String name; // 姓名
private String sex; // 性别
private String job; // 工作
private String address; // 地址
public CharacterInfo(String name, String sex, String job, String address) {
super();
this.name = name;
this.sex = sex;
this.job = job;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "CharacterInfo [name=" + name + ", sex=" + sex + ", job=" + job
+ ", address=" + address + "]";
}
}
4, 新建一个servlet类。
package com.twf.demo.servlet;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.dubbo.common.utils.IOUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.twf.demo.po.CharacterInfo;
@WebServlet("/FindCharacterInfoServlet") // 该注解将会作为接口url的一部分
public class FindCharacterInfoServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 响应参数格式设置
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json");
response.setStatus(HttpServletResponse.SC_OK);
// 如果是从JSP页面发起的请求,则参数是以下面的方式获取的。
// String parameter = request.getParameter("xxx");
// 现在是以这种方式先获取请求参数得json格式字符串
BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream(), "utf-8"));
String body = IOUtils.read(reader); // 获取请求参数的json格式字符串
// 然后将json字符串转为Java对象,这里只对参数做一个打印操作,有需要的朋友可以自行做其做其他操作
CharacterInfo characterInfo = JSON.parseObject(body, new TypeReference<CharacterInfo>() {});
System.out.println(characterInfo.toString());
// 造几条数据返回
List<CharacterInfo> list = new ArrayList<CharacterInfo>();
CharacterInfo characterInfo1 = new CharacterInfo("孙少平", "男", "煤矿工人", "大牙湾煤矿");
CharacterInfo characterInfo2 = new CharacterInfo("孙少安", "男", "农民企业家", "双水村");
CharacterInfo characterInfo3 = new CharacterInfo("田晓霞", "女", "记者", "黄原省城");
CharacterInfo characterInfo4 = new CharacterInfo("田润叶", "女", "教师", "学校");
list.add(characterInfo1);
list.add(characterInfo2);
list.add(characterInfo3);
list.add(characterInfo4);
response.getWriter().println(list);
}
}
5,使用postman模拟发送请求及结果如下。请求的url(即接口)就是:IP+端口+项目名称+servlet类的路径注解,如果发送的是POST请求,就会执行doPost()方法,如果发送的是GET请求,就会执行doGet方法。
后台日志打印如下:
说明接口调用成功。
另外,url的配置也可以采用配置文件的方式,即
- 去掉servlet类的注解中的路径,只保留“@WebServlet”这部分
- 然后在web.xml文件中加上如下配置:
<servlet>
<description></description>
<display-name>FindCharacterInfoServlet</display-name>
<servlet-name>FindCharacterInfoServlet</servlet-name>
<servlet-class>com.twf.demo.servlet.FindCharacterInfoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FindCharacterInfoServlet</servlet-name>
<url-pattern>/FindCharacterInfoServlet</url-pattern>
</servlet-mapping>
项目源码点这里。