美文网首页
MVC之 Controller 控制器

MVC之 Controller 控制器

作者: 每天进步一点点变成更好的自己 | 来源:发表于2022-09-15 08:04 被阅读0次

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);

总结:


image.png

相关文章

网友评论

      本文标题:MVC之 Controller 控制器

      本文链接:https://www.haomeiwen.com/subject/aeqdqrtx.html