4

私は現在、JavaでいくつかのWeb開発プロジェクトに取り組んでいます.frontcontrollerを実装しました。これは、パスに応じて新しいコントローラーをインスタンス化することです。

したがって、ユーザーが ?q=user/login ex を実行している場合。フロントコントローラーは、このコードでやろうとしている UserController を開始する必要があります。

    String q = request.getParameter("q");

    try {
        String[] page = q.split("/");
        // Make first char upper, to match class name conventions.
        page[0] = (page[0].substring(0, 1).toUpperCase() + page[0].substring(1).toLowerCase()).trim();

      Class contDes = Class.forName("dk.elvar.rocks." + page[0]+ "Controller");
      Constructor co = contDes.getConstructor();
      co.newInstance(request, response, page);

これにより、

java.lang.NoSuchMethodException: dk.elvar.rocks.UserController.<init>()
at java.lang.Class.getConstructor0(Class.java:2706)
at java.lang.Class.getConstructor(Class.java:1657)
at dk.elvar.rocks.FrontController.doGet(FrontController.java:35)

私はグーグルでそれを調べようとしましたが、ロードされたオブジェクトでコンストラクターを宣言し、クラスを公開するというバグがすでに存在しています。

ユーザーコントローラー:

public class UserController extends HttpServlet  {

private final String USERNAME = "Martin";
private final String PASSWORD = "David";

    private static final long serialVersionUID = 1L;
HttpServletRequest request;  
HttpServletResponse response;

public UserController(HttpServletRequest request, HttpServletResponse response, String[] action)  {
    this.request = request;
    this.response = response;

    if(action[1].equalsIgnoreCase("login")) {
        this.renderLoginAction();
    }
    if(action[1].equalsIgnoreCase("val-login")) {
        this.validateLoginAction();
    }
}
4

2 に答える 2

14

そのクラスにはデフォルトのコンストラクタがないため、おそらくこの例外が発生します。getConstructorパラメータをメソッドに渡すことで、パラメータを持つコンストラクタを取得できます。

Constructor co = contDes.getConstructor(
                HttpServletRequest.class, 
                HttpServletResponse.class, 
                String[].class);
co.newInstance(request, response, page);
于 2012-09-13T11:13:39.120 に答える
0

通常、web.xml または struts-config.xml がリフレクションを使用してサーブレットをインスタンス化するために使用するため、デフォルト コンストラクター以外を使用することはお勧めしません。

デフォルトのコンストラクター以外のクラスのインスタンスを取得したい場合は、

Class userController = Class.forName("<packages.>UserController");
Constructor userControllerConstructor = userController.class.getConstructor(HttpServletRequest.class, HttpServletResponse.class, String[].class);
UserController userControllerObj = (UserController)constructor.newInstance(request,response, action);
于 2012-09-13T11:28:31.197 に答える