рд╕рд░реНрд╡рд▓реЗрдЯреНрд╕ рдПрдВрдб рд░рд┐рдлреНрд▓реЗрдХреНрд╢рди

рдЕрднреА рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рд▓реЗрдЦ рд╕рд░реНрд╡рд▓реЗрдЯреНрд╕ - рд░рд┐рдлреНрд▓реЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯреА рд╕реА рдЪрд╛рд▓ , рдореИрдВрдиреЗ рдПрдХ рдРрд╕реА рддрдХрдиреАрдХ рдХреЛ рд╕рдордЭрд╛, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдлрд╝реЙрд░реНрдо рдХрд╛ рдпреВрдЖрд░рдПрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
host/servletName/methodName.

рдпрджрд┐ рд╣рдо рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлреЙрд░реНрдо рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдирд┐рдпрдВрддреНрд░рдХреЛрдВ


рдЬрд╣рд╛рдВ, рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рдХрдИ рд╡рд░реНрдЧ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рд╣реИрдВред рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рд╣рдо рдпреВрдЖрд░рдЖрдИ рд╕реЗ рдирд┐рдпрдВрддреНрд░рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рддрдХ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
host/servletName/projects/add?title=hello



рдирд┐рдпрдВрддреНрд░рдХреЛрдВ


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рд░реНрд╡рд▓реЗрдЯ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ HttpServlet рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рд╕рднреА рдмреЗрд╕рд╕рд░реНрд╡рд▓реЗрдЯ рдХреНрд▓рд╛рд╕ рд╣реИрдВред

 package projectManagment; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import projectManagment.controllers.Controller; public class BaseServlet extends HttpServlet { private ControllerFactory factory; public BaseServlet () { super(); factory = new ControllerFactory(); } @Override protected void service(HttpServletRequest request, HttpServletResponse response) { try { String name = getControllerName(request); if (name == null) name = "index"; Controller controller = factory.create(name); Controller.setHttp(request, response, getServletContext()); String method = getMethodName(request); if (method == null) method = "index"; callMethod(controller, method, request, response); } catch (Exception e) { System.out.println("Error: " + e.getMessage()); e.printStackTrace(); } } public String getControllerName (HttpServletRequest request) { String path = request.getRequestURI().substring(request.getContextPath().length()); if (path == null || "".equals(path) || "/".equals(path)) return null; String controller = path.substring(1, path.lastIndexOf("/")); if (controller != null && !"".equals(controller)) return controller; return null; } private String getMethodName (HttpServletRequest request) { String method = request.getRequestURI().substring(request.getContextPath().length()); if (method != null && !"".equals(method) && !"/".equals(method)) return method.substring(method.lastIndexOf("/") + 1, method.length() ); return null; } private void callMethod (Controller controller, String methodName, HttpServletRequest request, HttpServletResponse response) throws IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException, NoSuchMethodException { for (Method method : controller.getClass().getMethods()) { if (method.getName().equalsIgnoreCase(methodName)) { controller.getClass().getMethod(methodName, method.getParameterTypes()).invoke(controller); } } } } 


рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рд╕реЗрд╡рд╛ рдкрджреНрдзрддрд┐ рдореЗрдВ рд╣реЛрддреА рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рдирд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ getControllerName рд╣реЗрд▓реНрдкрд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЬрд╣рд╛рдВ URI рдХреЛ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛рд░рдЦрд╛рдирд╛ рдЬреЛ рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдирд┐рдпрдВрддреНрд░рдХ рд╡рд░реНрдЧ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдмрдирд╛рддрд╛ рд╣реИред рдирд┐рдпрдВрддреНрд░рдХ рдХреЛрдб рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:

 package projectManagment; import java.util.HashMap; import java.util.Map; import projectManagment.controllers.*; public class ControllerFactory { public ControllerFactory() { map = defaultMap(); } public Controller create (String controllerName) { Class ControllerClass = (Class) map.get(controllerName); if (ControllerClass == null) throw new RuntimeException(getClass() + " was unable to find an controller named '" + controllerName + "'."); Controller controllerInstance = null; try { controllerInstance = (Controller) ControllerClass.newInstance(); } catch (Exception e) { e.printStackTrace(); } return controllerInstance; } protected Map<String, Class<?>> defaultMap() { Map<String, Class<?>> map = new HashMap<String, Class<?>>(); map.put("index", Index.class); return map; } protected Map<String, Class<?>> map; } 


рдпрд╣ рд╡рд┐рдзрд┐ рдХреЙрд▓ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, getMethodName рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХрд╛ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдХреЙрд▓рдореЗрдЯ рдХреЛ рдЖрд╡рд╢реНрдпрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░реЗрдВред рдпрд╣рд╛рдВ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдПрдХ рдЙрдкрдпреБрдХреНрдд рд╡рд┐рдзрд┐ рдХреА рдЦреЛрдЬ, рдФрд░ рдЗрд╕рдХреЗ рдХреЙрд▓ рдХреЗ рдмрд╛рджред

рд╕рднреА рдХрдВрдЯреНрд░реЛрд▓рд░ рдЬреЛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдХрдВрдЯреНрд░реЛрд▓рд░рдлреИрдХреНрдЯрд░реА рдХреЗ рдбрд┐рдлреЙрд▓реНрдЯ рдореИрдк рд╡рд┐рдзрд┐ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред

 package projectManagment.controllers; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Controller { static protected HttpServletResponse response; static protected HttpServletRequest request; static protected ServletContext context; public Controller () { request = null; response = null; context = null; } static public void setHttp (HttpServletRequest req, HttpServletResponse res, ServletContext con) { request = req; response = res; context = con; } } 


SetHttp рд╡рд┐рдзрд┐ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдмрд╛рдд рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╕рд┐рдЦрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдпрд╣рд╛рдВ рдЖрдк рдкреНрд░рд╛рдзрд┐рдХрд░рдг, рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдм рдЗрдВрдбреЗрдХреНрд╕ рдирд╛рдордХ рдЯреЗрд╕реНрдЯ рдХрдВрдЯреНрд░реЛрд▓рд░ рдмрдирд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рджреЛ рдЗрдВрдбреЗрдХреНрд╕ рдФрд░ рд╢реЛ рдореЗрдердб рд╣реЛрдВрдЧреЗред
 package projectManagment.controllers; public class Index extends Controller { public static void index () { System.out.println("Index method"); } public static void show () { String value = request.getParameter("name"); System.out.println("Hello " + value); } } 


рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ web.xml рдореЗрдВ рдореИрдкрд┐рдВрдЧ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ:
 <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <servlet> <servlet-name>Demo</servlet-name> <servlet-class>projectManagment.BaseServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Demo</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> 


рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд▓реЗрдЯ рдХрд╛ рдкрд░реАрдХреНрд╖рдгред / рд╣реЛрд╕реНрдЯ / рдбреЗрдореЛ / рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░ рд╣рдо рдХрдВрд╕реЛрд▓ рдореЗрдВ рд▓рд╛рдЗрди "рд╕реВрдЪрдХрд╛рдВрдХ рд╡рд┐рдзрд┐" рджреЗрдЦреЗрдВрдЧреЗ, рдФрд░ рдЕрдиреБрд░реЛрдз / рд╣реЛрд╕реНрдЯ / рдбреЗрдореЛ / рдЗрдВрдбреЗрдХреНрд╕ / рд╢реЛ рдореЗрдВ? рдирд╛рдо = рдПрдВрдЯреЛрди - "рд╣реИрд▓реЛ рдПрдВрдЯреЛрди"ред

рдПрдХ рд╡рд┐рдзрд┐ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рдирд╛


рдПрдХ рдпреВрдЖрд░рдЖрдИ рд╕реЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдлреЙрд░реНрдо рдХреЗ рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛
 String strValue = request.getParametr("intParamName"); Integer value = Intger.parseInt(strValue); 

рдХрдИ рдмрд╛рд░ рдЗрд╕ рддрд░рд╣ рдХреА рд╕рд╛рдзрд╛рд░рдг рд╣рд░рдХрддреЗрдВ рдХрд░рдирд╛ рдердХрд╛рдК рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдХреЛрдб рдХреА рд╕реБрдВрджрд░рддрд╛ рдХреЛ рдиреБрдХрд╕рд╛рди рдкрд╣реБрдВрдЪрддрд╛ рд╣реИред рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЧреНрд░рдгреА рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

 package projectManagment.controllers; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) public @interface Param { String name(); } 


рд╢реЛ рд╡рд┐рдзрд┐ рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
 public static void show (@Param(name = "name") String name, @Param(name = "age") Integer age) { System.out.println("Hello " + name + ", you are " + age + " years old"); } 


рдпрд╣ рд╕рдм рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпреВрдЖрд░рдЖрдИ рд╕реЗ рдХреЙрд▓ рд╡рд┐рдзрд┐ рдореЗрдВ рд╡рд┐рдзрд┐ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
 private void callMethod(Controller controller, String methodName, HttpServletRequest request, HttpServletResponse response) throws NoSuchMethodException, RuntimeException, SecurityException, IllegalAccessException, InvocationTargetException { for (Method method : controller.getClass().getMethods()) { if (method.getName().equalsIgnoreCase(methodName)) { Object[] params = new Object[method.getParameterTypes().length]; Annotation[][] parameterAnnotations = method.getParameterAnnotations(); Class[] parameterTypes = method.getParameterTypes(); int i = 0; for(Annotation[] annotations : parameterAnnotations){ Class parameterType = parameterTypes[i]; for(Annotation annotation : annotations){ if(annotation instanceof Param){ Param myAnnotation = (Param) annotation; Object value = null; if (parameterType.getSimpleName().equals("Integer")) { try { value = Integer.parseInt(request.getParameter(myAnnotation.name())); } catch (NumberFormatException e) { value = null; } } else { value = request.getParameter(myAnnotation.name()); } params[i++] = value; System.out.println("param: " + parameterType.getSimpleName()); System.out.println("name : " + myAnnotation.name()); System.out.println("value: " + value); } } } controller.getClass().getMethod(method.getName(), method.getParameterTypes()).invoke(controller, params); } } } 


рдЕрдм рдЕрдиреБрд░реЛрдз / рд╣реЛрд╕реНрдЯ / рдбреЗрдореЛ / рдЗрдВрдбреЗрдХреНрд╕ / рд╢реЛ рдХреЗ рд▓рд┐рдП? рдирд╛рдо = рдПрдВрдЯреЛрди рдФрд░ рдЙрдореНрд░ = 20, рдХрдВрд╕реЛрд▓ "рд╣реИрд▓реЛ рдПрдВрдЯреЛрди, рдЖрдк 20 рд╕рд╛рд▓ рдХреЗ рд╣реИрдВ" рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

Source: https://habr.com/ru/post/In120715/


All Articles