[debug] Thực thi method theo tên

trieutulonga

Member
15/2/11
58
6
8
Hi all , mình đang có một vấn đề , mình muốn điều hướng trang web theo tên của phương thức trong servlet
và đây là cách mình thực hiện

PHP:
import com.anhdt.vo.RestObject;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.logging.Level;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public abstract class BaseService extends HttpServlet {

    private static final Logger LOG = LoggerFactory.getLogger(BaseService.class);
    public final String GOTO = "goto";
    public final String METHOD = "method";

    public String ResponseJSon(Object object) {
        JSONObject result = new JSONObject(RestObject.fromData(object));
        return result.toString();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String gotoPage = request.getParameter(GOTO);
        try {
            Page page = Page.valueOf(gotoPage.toUpperCase());
            switch (page) {
                case CATEGORIES:
                    gotoPage(gotoPage, request, response);
                    break;
                case ABC:
                    gotoPage(gotoPage, request, response);
                    break;
            }
        } catch (IllegalArgumentException e) {
            LOG.info(" not found  :  " + gotoPage + " ; error : " + e.getMessage());
            gotoPage(gotoPage = "page404", request, response);
        }

    }

    public void gotoPage(String name, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        RequestDispatcher requestDispatcher;
        requestDispatcher = request.getRequestDispatcher(name + ".jsp");
        requestDispatcher.forward(request, response);
      
    }

    public void runMethod(String methodName , Class[] argTypes,Object[] object) {
        try {
            Class<?> c = Class.forName(this.getClass().getName());
            //Class[] argTypes = new Class[]{HttpServletRequest.class, HttpServletResponse.class};
            Method method = c.getDeclaredMethod(methodName, argTypes);
            method.invoke(c,object);
        } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
            java.util.logging.Logger.getLogger(BaseService.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}

enum Page {

    CATEGORIES,
    ABC,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}
BaseService là class được mở rộng từ HttpServlet và chưa các phương thức utils cho các class được kế thừa từ nó và điều hướng người dùng phương thức runMethod() được viết đẻ thực hiện một phương thức theo tên của nó (tên sẽ được người dùng gủi lên)

PHP:
import com.anhdt.model.Menu;
import com.anhdt.vo.TopicVO;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.List;
import java.util.logging.Level;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;


public class MenuService extends BaseService {
   private static final Logger LOG = LoggerFactory.getLogger(MenuService.class);
 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException, SQLException {
        response.setContentType("application/json;charset=UTF-8");
        try (PrintWriter out = response.getWriter()) {
            Menu menu = new Menu();
            List<TopicVO> list = menu.getMenu();
            out.println(this.ResponseJSon(list));          
        }
    }

  
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
      try {
            String method = request.getParameter(METHOD);
            if (method == null) {
                processRequest(request, response);
            } else {
                Class[] argTypes = new Class[]{HttpServletRequest.class, HttpServletResponse.class};
                Object[] objectParam = new Object[]{request, response};
                runMethod(method, argTypes, objectParam);
            }
        } catch (SQLException ex) {
            java.util.logging.Logger.getLogger(CateDetail.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
  
    protected void show(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, SQLException {
         response.setContentType("text/html;charset=UTF-8");
        try (PrintWriter out = response.getWriter()) {
             out.println("hello!");
        }
    }

 
}
MenuService được mở rộng từ BaseService trong lớp này mình có viết một hàm show() để test
và đây là request của người dùng : http://localhost:8084/my-web/menuService?method=show
đây là ngoại lệ mình nhận được

Code:
02-Jun-2014 09:22:20.034 SEVERE [http-nio-8084-exec-12] BaseService.runMethod null
java.lang.IllegalArgumentException: object is not an instance of declaring class
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at BaseService.runMethod(BaseService.java:60)
    at MenuService.doGet(MenuService.java:40)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:301)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:74)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1015)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:652)
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1575)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1533)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)
ai đó có thể giải thích nguyên nhân và giải pháp cho vấn đề của mình ?
 

Joe

Thành viên VIP
21/1/13
2,898
1,293
113
Close topic !
You make fun of this forum, don't you? You posted a request, then closed it without saying what problem you encountered and how you solved it. If you still behave like this, nobody will bother to help you in the future. And that includes me.
 

trieutulonga

Member
15/2/11
58
6
8
sorry all !
đây là lời giải thích của mình
bắt đầu từ thông báo lỗi "object is not an instance of declaring class" và "at BaseService.runMethod(BaseService.java:60)" từ console ,câu lệnh của mình bị break tại dòng 60 của class BaseService "method.invoke(c,object);" => mình đoán có thế c không được hiểu là một instance của class => vì mình muốn nó thực hiện trên Class đang được gọi mình thay thế bằng câu lệnh "method.invoke(this,object);" sau đó mình debug tiếp và mình nhận thấy 2 param mình đưa vào có một số thuộc tính không có giá trị . mình kiểm tra và thay thế nó bằng câu lệnh dưới
"
Class[] argTypes = {HttpServletRequest.class, HttpServletResponse.class};
Object[] objectParam = {request, response};
" trong class MenuService , sau đó mình test và mọi việc ok theo ý mình .

Hi Joe!
thứ nhất mình đã "sorry all" , như ở trên đã nói , bao gồm cả bạn ("Anh" có thể mình ít tuổi hơn),
thứ 2 mình có một số ý kiến cá nhân của mình :
- mình đưa ra vấn đề rất cụ thể và nghiêm túc (có mô tả và có code) ,tức là mình thực sự quan tâm đến vấn đề mình đang đề cập do đó mình phủ định nhận định của bạn "You make fun of this forum, don't you?" ok !
- việc mình đóng chủ đề lại vì mình đã tìm được lời giải , và mình muốn mọi người focus những vấn đề của các bạn khác .
- thứ 3 mình có một vài nhận xét về một vài nhận xét về bạn :
không phải mọi vấn đề đều có thế được thực hiện bằng code ngay lập tức nó có thể bắt đầu bằng một ý tưởng và mọi người cùng xây dựng giải pháp (không phải cứ phải có code thì mình mới đưa câu trả lời),
những lời nhận xét của bạn cũng thật "thẳng thắn" , nhưng nhiều lúc nó nghe có vẻ cực đoan(cảm nhận) ! tất nhiên là mình luôn nhìn vào mặt tích cực của vấn đề .
và cuối cùng mình tham gia diễn dàn với phương châm "học tập để chia sẻ, chia sẻ để học tập" vì thế mình tiếp thu mọi ý kiến của tất cả mọi ngươi (theo cách nhìn tích cực ) ok.