Spring MVC —1 注解方式、页面传取值

新建项目预设:
File——>Other Settings——>Settings for New Project——>File Encodings——>搜索encoding——>设置字符集

1.MVC概念

MVC模式简介:
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,它 是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码 ,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

M-Model 模型层:
Model(模型)的主要职责是负责业务逻辑,其又包含两层:业务数据层(Bean,DAO,DAOImpl)和业务逻辑处理(service)。

V-View 视图层:
view(视图)的主要职责负责界面显示和用户交互,通常视图是依据模型数据创建的,属于视图层组件一般上来说就是jsp。

C-Controller 控制层:
Controller(控制器) 是模型层M和视图层V的桥梁,控制器接受用户的输入并调用模型和视图去完成用户的需求,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。

Spring Web MVC核心组件

  • DispatcherServlet(控制器,请求入口)
  • HandlerMapping(处理器映射器,请求派发)
  • Controller(处理器,请求处理流程)
  • ModelAndView(模型,封装业务处理结果和视图)(既要返回一些数据,也要返回一些视图)
  • ViewResolver(视图,视图显示处理器)

2.MVC搭建流程

前端控制器(DispatcherServlet)————HandlerMapping————Controller———— ModelAndView————VR
(1)前端控制器(过滤请求*.do)
(2)HandlerMapping(映射器,请求处理转至Controller)
(3)Controller分发处理业务
(4)Return ModelAndView(“hello")
(5)视图解析器(拼接前缀和后缀形成完整视图路径,拼接视图路径转至实际页面)

配置方式
mvc-1.前端控制器

<!-- mvc-1.前端控制器 -->
<servlet>
    <servlet-name>spring-mvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <!--加载配置文件 -->
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </init-param>
    <!--优先启动 -->
    <load-on-startup>1</load-on-startup>
</servlet>

<!--配置映射路径 -->
<servlet-mapping>
    <servlet-name>spring-mvc</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

mvc-2.HandlerMapping处理并请求并转发给Controller,进行业务逻辑处理

<!--配置方式 -->
<bean id="testController" class="cn.goktech.controller.TestController" />
<!--mvc-2.HandlerMapping处理并请求并转发给Controller -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" >
    <property name="mappings">
        <props>
           <prop key="/hello.do">testController</prop>
        </props>
    </property>
</bean>

mvc-3.Controller分发处理业务
mvc-4.返回视图

//3.Controller分发处理请求
public  class TestController implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        System.out.println("请求进入Controller");
  //mvc-4.返回视图
        return new ModelAndView("hello");
    }
}

mvc-5.视图解析器

<!--mvc-5.视图解析器(/jsp/hello.jsp) :将返回的ModelAndView拼接成完整的路径 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/jsp/" />
    <property name="suffix" value=".jsp" />
</bean>

Spring Web MVC工作流程

1、用户发起请求到前端控制器(DispatcherServlet),该控制器会过滤出哪些请求可以访问Servlet、哪些不能访问。就是url-pattern的作用,并且会加springmvc.xml配置文件。
2、前端控制器会找到处理器映射器(HandlerMapping),通过HandlerMapping完成url到controller映射的组件,简单来说,就是将在springmvc.xml中配置的或者注解的url与对应的处理类找到并进行存储,用map<url,handler>这样的方式来存储。
3、HandlerMapping有了映射关系,并且找到url对应的处理器,HandlerMapping就会将其处理器(Handler)返回,在返回前,会加上很多拦截器。
4、DispatcherServlet拿到Handler后,找到HandlerAdapter(处理器适配器),通过它来访问处理器,并执行处理器。
5、执行处理器(一般是指Controller)。
6、处理器会返回一个ModelAndView对象给HandlerAdapter。
7、通过HandlerAdapter将ModelAndView对象返回给前端控制(DispatcherServlet)。
8、前端控制器请求视图解析器(ViewResolver)去进行视图解析,根据逻辑视图名解析成真正的视图(jsp),其实就是将ModelAndView对象中存放视图的名称进行查找,找到对应的页面形成视图对象。
9、返回视图对象到前端控制器,此时ModelAndView对象中是又有数据,又有视图。
10、视图渲染,就是将ModelAndView对象中的数据放到request域中,用来让页面加载数据的。
11、通过第8步,通过名称找到了对应的页面,通过第10步,request域中有了所需要的数据,那么就能够进行视图渲染了。最后将其返回即可。


3.注解方式

注解方式主要是优化HandlerMapping和Conroller之间的连接
(1)注解方式
<context:componet-scan base-package =“要扫描的包” /> (不能扫描@RequestMapping)
< mvc:annotation-driver>(扫描@RequestMapping)

<!--二、注解方式 -->
<!-- 扫描基本注解-->
<context:component-scan base-package="cn.goktech.*" />
<!--@RequestMapping注解扫描 -->
<mvc:annotation-driven />

(2)关键注解
@Controller
@RequestMapping

@RequestMapping既可以作用在类上,也可以作用在方法上,类上面的@RequestMapping可以省略,方法上的@RequestMapping不可省略。

@Controller
@RequestMapping("/index")  //可省略
public class IndexController {
   //访问:/index/test.do ,注意:在配置中不可省略 .do ,在注解@RequestMapping中可以不用写 .do ,自动识别
    @RequestMapping("/test")   //不可省略
    public String test(){ //写String的时候默认返回的是视图
        System.out.println("Welcome to anno type");
        return "hello";//返回一个视图
    }

index.jsp

<h3>
    <a href="/index/test.do">测试注解方式</a>
</h3>

4.页面值的获取及传递

(1)从前端取值
(2)向前端传值
(3)@ModelAttribute与@SessionAttributes的使用

接收页面值(request,@RequestParam,自动封装bean)
向页面传递值(request,Model,@ModelAttribute+@SessionAttribute)

request

@RequestMapping("/test1")
public String testRequest(HttpServletRequest request){
   //request页面取值
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    System.out.println(username+";"+password);

    //request页面传值
    request.setAttribute("userId","1001");
    return "hello";
}

@RequsetParam

@RequestMapping("/test2")
public ModelAndView testModelAndParam(@RequestParam("username") String username, Map<String,Object> model){
   //@RequestParam页面取值,当前端有一个名字跟@Request的形参一样时,就会封装到里面
    System.out.println(username);
    //Map传值
    model.put("edu_1001","Alice");
    model.put("edu_1002","Bob");

    return new ModelAndView("hello",model);
}

自动封装bean

@RequestMapping("/testUser2")
public String testBean( User user){
    System.out.println(user);
    return "hello";
}

向页面传值

@RequestMapping("/test3")
    public String testBean(@ModelAttribute User user, Model model){//将一个对象或需要的值通过注解放到ModelAttribute
        System.out.println(user);
        return "hello";
    }

注:@ModelAttribute 把User 对象放到request之中,其中User是键,user对象是值

index.jsp

<h3>
  <a href="/index/test3.do?id=1001&name=Alice&age=20&phone=13316391906">测试自动封装bean</a>
</h3>

User类

public class User {
    private int id;
    private String name;
    private int age;
    private String phone;

hello.jsp

<h3>@ModelAttribute取值:${user.id}--${user.name}--${user.age}--${user.phone}</h3>

在这里插入图片描述
@SessionAttribute
这个注解不是加在某个方法上面,而是加在类上面

@Controller
@RequestMapping("/index")  //可省略
@SessionAttributes({"user1"})
public class IndexController {
@RequestMapping("/test3")
public String testBean(@ModelAttribute User user, Model model){//将一个对象或需要的值通过注解放到ModelAttribute
    model.addAttribute("user1","Bob");
    System.out.println(user);
    return "hello";
     }
}
<h3>
  <a href="/index/test3.do?id=1001&name=Alice&age=20&phone=13316391906">测试自动封装bean</a>
</h3>
<h3>@SessionAttributes:${user1}</h3>

在这里插入图片描述


常见的报404错误可能是以下几种情况造成的:
类没有找到:
1.没有jar包
2.路径写错了,Ctrl试一下能不能点进去
3.看一下上次那个是compile还是provided

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值