SpringMVC学习(2)

1.使用注解开发Spring MVC

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
  <!--1.注册 DispatcherServlet-->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--管理一个springmvc的配置文件-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc-servlet.xml</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

springmvc-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd  ">

    <!--自动扫描包,让指定包下的注解生效,由IOC容器统一管理-->
    <context:component-scan base-package="com.hongkai.controller"/>
    <!--让spring mvc不处理静态资源 如:.css .js .html .mp3......-->
    <mvc:default-servlet-handler/>
    <!--完成handlerMapping handlerAdapter两个实例的注册-->
    <mvc:annotation-driven/>

    <!--ViewResolver(视图解析器):DispatcherServlet给它的ModeAndView-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <!--后缀-->
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

使用注解开发,不需要在这里在注册bean,改为在Controller中使用@Controller注解

    <!--Handler-->
    <bean id="/hello" class="com.hongkai.controller.HelloController"></bean>

创建Controller

@Controller
public class HelloController {
    @RequestMapping("/hello")
    public String hello(Model model){
        //封装数据
        //向模型中添加属性msg与值,可以在jsp页面取出并渲染
        model.addAttribute("msg","hello,springmvc annotation!");
        return "hello";//会被视图解析器解析
    }
}
@Controller是为了让Spring IOC容器初始化时自动扫描到

@RequestMapping是为了映射请求路径

方法中Model类型的参数是为了把Action中的数据带到视图中

返回的结果是视图的名称hello 加上配置文件中的前后缀就变成WEB-INF/jsp/hello.jsp

视图 hello.jsp

<html>
<body>
${msg}
</body>
</html>

 2.Controller配置总结

Controller(控制器)负责提供访问应用程序的行为,通常通过接口定义或注解两种方法实现,推荐使用注解方式。

接口定义:一个控制器只能有一个方法,如果有多个方法需要定义多个Controllr,非常的麻烦!

public class HelloController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        //ModelAndView 模型和视图
        ModelAndView mv = new ModelAndView();
        //封装对象 放在ModelAndView中
        mv.addObject("msg","HelloSpringMvc");
        //封装要跳转的视图,放在ModelAndView中
        mv.setViewName("hello");//相当于 /WEB-INF/jsp/hello.jsp
        return mv;
    }
}

注解:

@Controller
public class HelloController {
    @RequestMapping("/h1")
    public String hello(Model model){
        //封装数据
        model.addAttribute("msg","hello,springmvc annotation!");
        return "hello";//会被视图解析器解析
    }
}

被@Controller注解的类中的所有方法,如果返回值是Srting并且有具体的页面可以跳转,那么就会被视图解析器解析

3.数据处理

处理提交数据

实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int id;
    private String name;
    private int age;
}
@Controller
@RequestMapping("/user")
public class UserController {
    //提交的域名参数与方法的参数名一致
    //http://localhost:8080/user/t1?name=zhangsan
    //http://localhost:8080/user/t1?username=zhangsan 后台获取值为null
    @GetMapping("/t1")
    public String test1(String name, Model model){
        //1.接收前端参数
        System.out.println("前端传递的参数为:"+name);
        //2.将返回的结果传递给前端
        model.addAttribute("msg",name);
        //3.视图跳转
        return "hello";
    }
    //提交的域名参数与方法的参数名不一致
    //http://localhost:8080/user/t2?username=zhangsan
    //http://localhost:8080/user/t2?name=zhangsan 报400错误
    @GetMapping("/t2")
    public String test2(@RequestParam("username") String name, ModelMap map){
        System.out.println("前端传递的参数为:"+name);
        //2.将返回的结果传递给前端
        map.addAttribute("msg",name);
        //3.视图跳转
        return "hello";
    }
    //提交的是一个对象
    //http://localhost:8080/user/t3?id=1&name=zhangsan&age=18
    //前端传递的参数名必须与对象名必须一致,否则无法匹配 为null
    @GetMapping("/t3")
    public String test3(User user){
        //1.接收前端参数
        System.out.println("前端传递的参数为:"+user);
        //3.视图跳转
        return "hello";
    }
}

数据显示到前端

1.ModelAndView

2.Model

3.ModelMap--->继承了LinkedHashmap

对比:

Model 只有寥寥几个方法只适合与存储数据
ModelMap 继承了LinkedMap,除了自身的方法还继承了LinkedMao的方法和特性
ModelAndView 可以存储数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值