写一个通用控制器,在开发的时候只用写模型和视图。
注:请求路径和模型的对应关系
step1.添加一个注解@RequestMapping
/**
自定义注解:用于配置请求路径和处理器的对应关系。
*/
@Retention(RetentionPolicy.RUNTIME) //保留至运行时。所以我们可以通过反射去获取注解信息。 public @interface RequestMapping( ){//自定义注解 public String value( ); }
step2:写一个java类(HelloController),即处理器。
/* 处理器:负责处理业务逻辑。 */ public class HelloController{ @RequestMapping(“/hello.do”) public String hello(){ System.out.println(“HelloController的方法”); /*返回视图名:viewResolver会将视图名映射成对应的jsp。*/ return “hello”; }
step3:添加smartmvc.xml
<?xml version="1.0" encoding="UTF-8"?> <beans> <!-- 配置处理器: class属性用于指定处理器的类名。 --> <bean class="demo.HelloController"/> </beans>
step4.写DispatcherServlet
public class DispatcherServlet extends HttpServlet { //读取Http请求的内容? private static final long serialVersionUID = 1L; private HandlerMapping handlerMapping; @Override /** * 读取配置文件(smartmvc.xml),将处理器实例化, * 然后将这些处理器交给HandlerMapping(映射处理器) * 来处理。 * 注: * HandlerMapping读取处理器中的路径信息,建立 * 请求路径与处理器的对应关系。 */ public void init() throws ServletException{ //利用dom4j解析配置文件 SAXReader sax=new SAXReader(); InputStream in=getClass().getClassLoader(). getResourceAsStream(“smartmvc.xml”); try{ //解析配置文件 Document doc=sax.read(in); //获取根元素下面的所有子元素 List<Element> elements=root.elements( );//?? List beans=new ArrayList( ); for(Element ele:elements){ //获得处理器类名 String className=ele.attribute(“class”); System.out.println(“className:”+className); //将处理器实例化 Object bean=Class.forName( ).newInstance( ); //将处理器实例添加到集合里面 bean.add(bean); } System.out.println(“beans:”+beans); }catch(Exception e){ e.printStackTrace(); throw new ServletException(e); //由于重写,所以重写的方法的异常不可以大于父类的异常,但这样就可以了 //吗?这是什么处理?异常的该如何抛出来?这种用法何时用怎么用? //为什么这样用? } } }
step5.写HandlerMapping
/* 映射处理器:负责请求路径和处理器的对应关系。 */ //存放请求路径与处理器的对应关系 private Map<String,Handler> handlerMap=new HashMap<String,Handler>(); /*依据请求路径,返回对应的Handler对象*/ public Handler getHandler(String path){ return handlerMap.get(path); } /* 负责建立请求路径与处理器的对应关系: 利用java反射获得处理器实例上的@RequestMapping注解,然后 接下来,以该路径信息作为key,以处理器实例及其方法对象(Method 对象)的封装(Handler)作为Value,将请求路径与处理器的对应关系存放到 map里面。 */ public void process(List beans){ for(Object bean:beans){ …}
==============================================================================================================
灵感来自代码,多敲,有时看得费力时候,就多敲几次,并画图,
并把细节了解清楚直到能默写。
(画上面的思维图,另外还有细节的思路图)
(5)如何使用SmartMVC?
step1.创建一个maven工程。
step2.导包。
在pom.xml文件中,添加如下所标配置:
<dependencies> <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency> </dependencies>
step3.拷贝base包
注: base包包含了SmartMVC的核心源代码。
step4.配置DispatcherServlet
<servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>base.web.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
step5.添加处理器类
注:在方法前添加@RequestMapping注解:
@RequestMapping("/toBmi.do")
public String toBmi(){
return "bmi";
}
step6.添加jsp
注:
jsp的名称要与视图名一致。
step7.配置smartmvc.xml
注: 添加处理器的配置信息:
<beans> <!-- 配置处理器: class属性用于指定处理器的类名。 --> <bean class="controller.BmiController"/> </beans>