Java Web之BaseServlet的抽取
在Java Web學(xué)習(xí)的初期,開(kāi)發(fā)的小項(xiàng)目幾乎都是JSP+Servlet+JDBC,長(zhǎng)期開(kāi)發(fā)下來(lái),會(huì)發(fā)現(xiàn)當(dāng)業(yè)務(wù)邏輯設(shè)計(jì)的接口一多的時(shí)候,充當(dāng)控制器的Servlet也會(huì)越來(lái)越多,但是處理的業(yè)務(wù)邏輯相對(duì)單一。后來(lái)學(xué)習(xí)Struts2或者SpringMVC,發(fā)現(xiàn)它們處理起來(lái)優(yōu)雅得多,但是配置起來(lái)也比純的Servlet要繁瑣,對(duì)于經(jīng)常做小項(xiàng)目的我來(lái)說(shuō)有點(diǎn)大材小用了,于是我根據(jù)前人的經(jīng)驗(yàn)抽離了一個(gè)BaseServlet,用反射的機(jī)制來(lái)處理請(qǐng)求,這樣處理業(yè)務(wù)邏輯的Servlet要相對(duì)簡(jiǎn)單的多,廢話不說(shuō),把自己使用的一套拿出來(lái)曬曬。
BaseServlet
由于服務(wù)器端經(jīng)常是用JSON與Android和iOS客戶端進(jìn)行交互,所以這里返回的就是JSON數(shù)據(jù)
//這個(gè)抽象類,BaseServlet類不需要在web.xml中進(jìn)行配置 public abstract class BaseServlet extends HttpServlet {// final 防子類復(fù)寫public final void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doPost(request, response);}public final void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 1、獲得執(zhí)行的方法名String methodName = request.getParameter("method");// 默認(rèn)方法if (methodName == null) {methodName = "execute";}System.out.println("BaseServlet : " + this + " , " + methodName);try {// 2、通過(guò)反射獲得當(dāng)前運(yùn)行類中指定方法,形式參數(shù)Method executeMethod = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);// 3、反射執(zhí)行方法String result = (String)executeMethod.invoke(this, request, response);// 4、將json數(shù)據(jù)返回response.getWriter().write(result);} catch (NoSuchMethodException e) {throw new RuntimeException("請(qǐng)求的方法[" + methodName + "]不存在");} catch (Exception e) {e.printStackTrace();throw new RuntimeException("服務(wù)器異常", e);}}/*** 此方法用于復(fù)寫,方便子類編程,默認(rèn)執(zhí)行方法*/public void execute(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {} }真正處理業(yè)務(wù)邏輯的Servlet
需要做的就是繼承上面的BaseServlet,然后根據(jù)業(yè)務(wù)需求寫自己的方法即可,乍一看像SpringMVC,但是要注意這里的方法名和返回值,方法名決定了請(qǐng)求時(shí)的method參數(shù)的值,返回值由于是JSON,所以用的是String。
public class UserServlet extends BaseServlet {public String users(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ArrayList<User> users = new ArrayList<User>();for (int i = 0; i < 10; i++) {User user = new User(i, "zhangsan" + i, i + 10, "wukong" + i);users.add(user);}Gson gson = new Gson();return gson.toJson(users);} }========================================================== //自定義的一個(gè)PO public class User {private int id;private String name;private int age;private String nickname;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}public User(int id, String name, int age, String nickname) {this.id = id;this.name = name;this.age = age;this.nickname = nickname;} }部署Servlet
將自己的業(yè)務(wù)UserServlet部署到web.xml,如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><servlet><servlet-name>UserServlet</servlet-name><servlet-class>test.app.api.UserServlet</servlet-class></servlet><servlet-mapping><servlet-name>UserServlet</servlet-name><url-pattern>/UserServlet</url-pattern></servlet-mapping></web-app>訪問(wèn)Servlet
部署并啟動(dòng)tomcat以后,打開(kāi)瀏覽器訪問(wèn):http://localhost/AppTestAPI/UserServlet?method=users
結(jié)果如下:
總結(jié)
以上是生活随笔為你收集整理的Java Web之BaseServlet的抽取的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 提升体验-支持Chrome Custom
- 下一篇: java美元兑换,(Java实现) 美元