MVC: https://www.tutorialspoint.com/springmvc/springmvc_controllerclassnamehandlermapping
体系结构:https://doc.yonyoucloud.com/doc/wiki/project/struts-2/architecture.html
Spring Web MVC 框架:https://www.w3cschool.cn/wkspring/9pf81ha5.html
Controller:控制器
控制器: 用于接收请求,校验参数,调用Model层获取业务数据,构造和绑定上下文,并转给View层去渲染。即控制器是MVC的大脑,它知道接下去该让谁去做什么事情。
比如我们从前端操作,去发出一个请求数据,接下来会去怎么操作呢?控制器会通过怎样的步骤,履行完他的职责,并最终转到相应的视图。
1、路径映射和视图指向
MVC的控制器想象成一个黑盒,有入口和出口,去完成一系列的操作。
入口路由: 路径映射,根据配置的规则,以及请求URI路径,找到具体接收和处理这个请求的控制器逻辑。
出口路由:视图指向,根据配置的规则,以及控制器完毕后返回的信息,找到需要渲染的视图页面。
Structs2
Structs2 MVC框架提供了一套自己的映射匹配逻辑,将 /books 的请求转给BookAction。BookAction处理完毕,通过返回result中的视图名字,请求可以被转发给响应的视图。
result 2个标签:根据控制器返回的视图名来配对具体的视图页面
<action name="books" class="xxx.xxx.BookAction">
<result name="success" type="dispatcher">/success.jsp</result>
<result name="input" ... />
</action>
Servlet
Tomcat的web.xml,配置路径映射,通过 xx/books 被转到BookServlet
<servlet>
<servlet-name>BookServlet</servlet-name>
<servlet-class>com.xxx.xxx.BookServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>BookServlet</servlet-name>
<url-pattern>/books</url-pattern>
</servlet-mapping>
Servlet通过代码完成,视图指向:
request.getRequestDispatcher("/book.jsp").forward(request, response);
Struts
当以 /books 为路径的 GET 请求到来时,会被转给 BookAction 的 get 方法。在控制器的活干完之后,根据返回的名称 success,下一步请求就会转到视图 /book.jsp 中去。
public class BookAction extends ActionSupport {
@Action(value="/books", results={
@Result(name="success",location="/book.jsp")
})
public String get() {
...
return "success";
}
}
Spring MVC
CoC 原则:Convention over Configuration,即规约优于配置。
ControllerClassNameHandlerMapping 声明以后,会根据Controller类名的规约来完成映射。
在使用 /books 去访问的时候,请求就会被自动转交给定义好的控制器逻辑。
public class BooksController extends AbstractController {
@Override
protected ModelAndView handleRequestInternal() throws Exception {
...
}
}
2、请求参数绑定
请求被送到了指定的控制器方法,接下来,需要从HTTP请求中把参数取出来,绑定到控制器这一层,以便使用。整个控制器的流程中,有两次重要的数据绑定,这次是为了控制器而绑定请求数据,后面在视图上下文构造还有一次绑定。
给BookAction 设置一个和参数同名的属性,并以规则的get/set方法,就能将请求中的参数自动注入。
前提:传入的URI/books?page.pageSize=1&page.pageNo=2&page.orderBy=desc
pageNo、pageSize、orderBy 这3个值会被设置到一个page对象中,而这个page对象则会被自动注入到BookAction的实例中去。
struct的处理
public class BookAction extends ActionSupport {
private Page page;
public void setPage { ... }
public Page getPage { ... }
}
Spring MVC的处理
前提:传入的URI /comic/books?author=Jim
Spring MVC使用注解的方式来处理,和URL的结构放在一起观察。
分类comic 就会作为方法参数category的值传入,作者Jim作为方法参数authour的值传入。
@RequestMapping("/{category}/books")
public ModelAndView get(
@PathVariable("category")
String category,
@RequestParam("author")
String author)
{ ... }
绑定了一个Page对象,在视图层中可以使用对象导航图语言表达式直接取得
<p>第 ${page.pageNo} 页</p>
Structs 参数验证
参数验证的操作因为和请求对象密切相关,通过都是在控制器完成的。
Structs 提供了一个将参数验证解耦到配置文件的办法
Structs
<validators>
<field name="name">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>书名不得为空</message>
</field-validator>
<field-validator type="stringlength">
<param name="maxLength">100</param>
<param name="minLength">1</param>
<message>书名的长度必须在 1~100 之间</message>
</field-validator>
</field>
</validators>
struts提供了基于注解的参数验证方式,将注解加载自动注入参数的set方法处
@RequiredFieldValidator(trim = true, message = "书名不得为空.")
@StringLengthFieldValidator(minLength = "1", maxLength = "100", message = "书名的长度必须在 1~100 之间")
void setName(String name) { ... }
视图上下文绑定
在控制器中,需要将数据传入视图层中,可能会携带用户传入的参数,也可能是在控制器中查询模型得到的数据。即这种传入方式,就是将数据绑定到视图的上下文中。
Servlet,可以用setAttribute的方法将参数设置到request对象中,视图层可以使用getAttribute方法把该参数的值取出来。
request.setAttribute("page", xxx);
总结:
![](https://img.haomeiwen.com/i26045017/4ae30e6a90496774.png)
网友评论