本文作者twowinter,发布于2015年,如今整理重发。
Servlet
1 前言
Servlet是整个javaweb的基石,在微信bluelight的DEMO中,CallbackServlet就是整个web处理的入口,所有的消息都是从这边进入的。
/**
* 微信回调请求处理
*/
public class CallbackServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private CallbackService service = new CallbackService();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
try {
// 开发者接入验证
String timestamp = req.getParameter("timestamp");
String nonce = req.getParameter("nonce");
String signature = req.getParameter("signature");
String echostr = req.getParameter("echostr");
if (signature.equals(SHA1.gen(WxConfig.TOKEN, timestamp, nonce))) {
out(echostr, resp);
} else {
out("", resp);
}
} catch (Throwable e) {
e.printStackTrace();
out("", resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
try {
// 编码格式
req.setCharacterEncoding("UTF-8");
// 验证签名
String timestamp = req.getParameter("timestamp");
String nonce = req.getParameter("nonce");
String signature = req.getParameter("signature");
if (!signature.equals(SHA1.gen(WxConfig.TOKEN, timestamp, nonce))) {
out("", resp);
return;
}
// 解析xml
Map<String, String> reqMap = parseXml(req.getInputStream());
System.out.println("reqMap=" + reqMap);
// 处理请求
String xmlStr = service.handle(reqMap);
System.out.println("xmlStr=" + xmlStr);
// null 转为空字符串
xmlStr = xmlStr == null ? "" : xmlStr;
out(xmlStr, resp);
} catch (Throwable e) {
e.printStackTrace();
// 异常时响应空串
out("", resp);
}
}
。。。。。。
}
这篇文章还是学习孙鑫《JavaWeb开发详解》,消化理解,提炼出知识要点。
2 Servlet与Tomcat的介绍
在java中,给我们提供了编写服务器拓展功能的技术-Servlet。它是基于java技术的Web组件,运行在服务器端,由Servlet容器所管理,用于生成动态的内容。
常见的Servlet容器是tomcat。
下面是Tomcat服务器接受客户请求并做出响应的图例。
3 Tomcat的安装
tomcat是一个开源的面向java的web服务器,http://tomcat.apache.org/,安装JDK之后,再下载安装添加环境变量JAVA_HOME即可。
启动tomcat后,打开浏览器确认安装完成。
4 Servlet接口
Tomcat提供了Servlet接口供大家编写自己的Servlet,但我们没必要自己造轮子,已经有很多具体的实现类:如公共类GenericServlet,如针对Http协议的HttpServlet。HttpServlet是继承于GenericServlet。
针对HTTP1.1中定义的7种请求方法Get、Post、Head、Put、Delete、Trace和Option,HttpServlet分别提供了7种doXXX()处理方法。
结合微信的例子来看,它就是继承了HttpServlet,内部用了doGet和doPost两个处理。
虚拟目录
在conf/server.xml中可以配置虚拟目录。