フレームワーク、JavaWeb、反射、MySQLの、C3P0技術などのマイクロチャネルのPCのチャットページ、無使用のssh、SSMの書き込み側の週の始まりを模倣。ここではコア技術とこれはお知らせください記載されています。
プロジェクトは、伝統的なJavaWeb異なり
従来のJavaWebプロジェクトは、対応するサーブレットを書き込むためのすべての要求は、これが完了数十サーブレット、および反射の原理を利用してを書き留めるために必要になります(対応するメソッド名から取り出し取得したURLパターンに基づいて、さらにこの問題に良い解決策になることができます)、適切なメソッドを呼び出します。
1、コンフィギュレーション・ファイルweb.xml
利用
<servlet>
<servlet-name>UserServlet</servlet-name>
<servlet-class>com.hsy.action.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserServlet</servlet-name>
<url-pattern>/user</url-pattern>
</servlet-mapping>
2、ツールを作成BaseServlet
このクラスは、アクセスされる方法を決定するためのgetParameter(「方法」)とgetMethod(methodNameの、HttpServletRequest.class、HttpServletResponse.class)によって、プロジェクト全体の技術的核心です。クラスc = this.getClass()によって、取得するためのクラスは、現在のメソッドを呼び出し、そして最終的に対応する呼び出し(この、REQ、RES)の方法により行います
public class BaseServlet extends HttpServlet {
/*
* 它会根据请求中的m,来决定调用本类的哪个方法
*/
protected void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
res.setContentType("text/html;charset=utf-8");
// 例如:http://localhost:8080/demo1/xxx?method=login
String methodName = req.getParameter("method");// 它是一个方法名称
// 当没用指定要调用的方法时,那么默认请求的是execute()方法。
if(methodName == null || methodName.isEmpty()) {
methodName = "execute";
}
Class c = this.getClass();
try {
// 通过方法名称获取方法的反射对象
Method m = c.getMethod(methodName, HttpServletRequest.class,
HttpServletResponse.class);
// 反射方法目标方法,也就是说,如果methodName为add,那么就调用add方法。
String result = (String) m.invoke(this, req, res);
// 通过返回值完成请求转发
if(result != null && !result.isEmpty()) {
req.getRequestDispatcher(result).forward(req, res);
}
} catch (Exception e) {
throw new ServletException(e);
}
}
}
3. UserServletと継承されたツールを作成BaseServlet
ここでは、彼の作品の一つでこれを説明するだけの簡単な例です。リクエストのHTTPを仮定:// localhostの:? 8080 / DEMO1 /ユーザーメソッドの後=来るログインし、最初のweb.xmlに応じて、以下をUserServlet見つけます。熾烈な外観は少し無知な力であるかもしれない(TMがここでログインを実行することができます行ってきました???これはそれをナンセンスを行う方法はありません)。心配しないで、ゆっくり来る私に耳を傾けます。ツールBaseServlet継承されたこのUserServlet、技術上の反射によるステップは、我々はまだ、このクラスでのログイン方法を実行することはできませんか?私は少し間違っている感じ?そうです!!!私はBaseServlet方法を自動的に行う親クラスのメソッドを実行します継承されている場合でも、このクラスを訪問しましたか?通常の状況下では、場合でも、ああもインスタンス化可能サブクラス親クラスのコンストラクタのコンストラクタを呼び出すのに十分ではありません。それは自動的にこのクラスは、最初のサーバーのメソッドを呼び出します、それは自動的に親クラスのサーバーのメソッドを呼び出すことを意味し、サーブレットのライフサイクル・アプローチにサーバーメソッドを呼び出しますので、しかし、ここでは、可能です。このツールは、より多くの使用の合計が異なるメソッドを呼び出すBaseServletクラスのサブクラス(多くは現在、根本的なフレームワークは、1つのそのようなある実現)を実装しています。
public class UserServlet extends BaseServlet {
public String login(HttpServletRequest request,HttpServletResponse response){
System.out.println("UserServlet中的login方法调用了");
return null;
}
}