eBody {
String value() default "";
}
(2)修改 MyDispatcherServlet 的 executeDispatch 方法
//编写方法,完成分发请求
private void executeDispatch(HttpServletRequest request, HttpServletResponse response) {
MyHandler myHandler = getMyHandler(request);
try {
//如果 myHandler为 null,说明请求 url没有匹配的方法,即用户请求的资源不存在
if (myHandler == null) {
response.getWriter().print("<h1>404 NOT FOUND</h1>");
} else {//匹配成功,就反射调用控制器的方法
Class<?>[] parameterTypes = myHandler.getMethod().getParameterTypes();
//2.创建一个参数数组(对应实参数组),在后面反射调动目标方法时会用到
Object[] params = new Object[parameterTypes.length];
//遍历形参数组 parameterTypes,根据形参数组的信息,将实参填充到实参数组中
//...
//...
//...
//...
//反射调用目标方法
Object result =
myHandler.getMethod().invoke(myHandler.getController(), params);
//对返回的结果进行解析(原生的SpringMVC通过视图解析器来完成)
if (result instanceof String) {
//....略
}//这里还可以拓展
else if (result instanceof ArrayList) {//如果是一个集合
Method method = myHandler.getMethod();
//判断目标方法是否有一个@ResponseBody注解
if (method.isAnnotationPresent(ResponseBody.class)) {
String valueType = method.getAnnotation(ResponseBody.class).value();
//如果注解的为默认值,或者value="json",就认为目标方法要返回的数据格式为json
if ("json".equals(valueType) || "".equals(valueType)) {
//对Arraylist转为json字符串
//这里我们使用jackson包下的工具类解决
ObjectMapper objectMapper = new ObjectMapper();
String resultJson = objectMapper.writeva lueAsString(result);
//这里简单处理,就直接返回
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.write(resultJson);
writer.flush();
writer.close();
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
(3)pom.xml文件中引入jackson
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.4</version>
</dependency>
(4)MonsterController 测试类增加方法测试
/**
* 编写方法,返回json格式的数据
* 1.目标方法返回的结果是给SpringMVC底层通过反射调用的位置
* 2.我们在SpringMVC底层反射调用的位置接收到结果并进行解析即可
* 3. @ResponseBody(value = "json") 表示希望以json格式返回数据给浏览器
* @param request
* @param response
* @return
*/
@RequestMapping(value = "/monster/list/json")
@ResponseBody(value = "json")
public List<Monster> listMonsterByJson(HttpServletRequest request,
HttpServletResponse response) {
List<Monster> monsters = monsterService.listMonster();
return monsters;
}
(5)启动 tomcat,浏览器访问 http://localhost:8080/li_springmvc/monster/list/json
,返回如下结果,测试成功。
10.小结
SpringMVC机制梳理
-
web.xml 中配置前端控制器(DispatcherServlet)和 spring 容器文件
-
当启动 tomcat 时,DispatcherServlet 被 tomcat 创建
-
前端控制器工作: