sping MVC框架

上次介绍了一下ssh框架,  这次就简单的介绍一下MVC框架。

Spring MVC 介绍

Spring的一部分

Spring springmvc 无缝衔接

SpringMVC 是一个web层框架。  用来接收参数,和响应请求

快速搭建:

需是web项目,还要web.xml去配置一个springmvc核心接收参数的类,springMVC用的是servlet开发的

     1. 创建 web maven项目

     2. 导包

Spring 所有包 + spring-web  springmvc包

      3. 写配置文件

(springMVC.xml) 位置随便放

开启注解

an base-package="com.hd.controller"></context:component-scan>

     4. 写类

@Controller

public class HelloController {
   @RequestMapping("/hello")
    public void hello(){
        System.out.println("hello springmvc");
    }
}

   5. 在web.xml里面输入springmvc核心类

<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:springMVC.xml</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!--
    /*  拦截所有  包括静态资源
    /  目录匹配
    *.action  后缀名匹配
    -->
    <url-pattern>*.action</url-pattern>
</servlet-mapping>

  6. 测试打开网页,输入地址

如果使用的是maven项目,导包的方式要改为war包,默认的是jar包,改成war包配置tomcat就会选用xxx.war

打开网页可能会有404错误,在控制台打印了代码,说明我们写的方法已经执行了

ModelAndView
调用他的setViewName 方法可以实现页面的转发
@RequestMapping("/hello")
public ModelAndView hello(){
    System.out.println("hello controller");
    ModelAndView mav = new ModelAndView();
    mav.setViewName("/index.jsp");
    return mav;
}

Springmvc框架的结构:

1. 请求到达web.xml,配置了前台控制器(DispatcherServlet)

url-partten *.action

2.前端控制器就是一个老板,老板拿到了需求,指派handlerMapping解析请求,和配置文件中的拦截器,并且处理的结果返回给老板

3.老板这个时候去找handler执行器,执行结果

HandlerAdapter  去执行对应的方法

这个方法可以是modelAndView  将数据和要跳转的页面都封装到modelView这个类中,将modelAndView返回给老板

              Void

              Json字符串

4. 老板接收到modelAndView,对这个modelAndView进行解析,指派给viewResolver来解析式图,获得view

5.老板在拿到view交给视图渲染器去渲染,渲染成html返回给老板,老板将最终成品交给客户

 

这个框架的结构流程:需要程序员做的就只有  配置前端控制器然后书写handler(controller)

SpringMVC 绑定参数

 1. 获得原生态的servlet对象

Request

Response

Session

ServletContext

private ModelAndView servletNative(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {

想要获得原生态对象,只需要把这个对象放在controller的防问方法中,就能直接获得对应的对象

   2.普通类型的参数绑定

String +8大基本数据类型Integer

@RequestMapping("/normalParam")
public void normalParam(String name,Integer id){
    System.out.println(name);
}

只要把参数的名字写在函数的参数中,就可以直接进行绑定

8大基础类型最好采用他们封装类,好处是不传也不会报异常,比如如果是用int id那么访问时没有传id的参数,就会报异常,改为integer就不报

3. Pojo类型参数的封装

public void pojoParam(User user,String name){
    System.out.println(user);
    System.out.println(name);
}

直接把pojo对象放入参数,自动将参数封装到实体类中,并且如果还有其他的基本类型,也会将参数放入基本类型中

4. 直接对pojo的封装类绑定

  public void queryVoParam(QueryVo vo){
    System.out.println(vo);
}

 要求在传参的时候必须要使用ognl表达式的方式传参

比如user.name user.id 这样才能把参数封装到vo的属性中

5. 数组参数

public void arrayParam(Integer[] ids){
    for (Integer id:ids){
        System.out.println(id);
    }
}

要求地址为  ids = 1&ids=2

6. 集合参数

public void listParam(QueryVo vo){
        System.out.println(vo);
}

集合参数只能使用封装类

传参的时候 list=1&list=2&list=3…方式传参

List[0]=1&list[1]=2

请求的限制

1. 地址的限制

value = {"/listParam",“/asdf”}

 

2. 请求方法的限制

如果不写method就默认两种都有

@RequestMapping(value = {"/listParam"},method = RequestMethod.POST)

可以限制get/post

3.请求的方法不仅有post和get

* 中国人 post/get

* 添加 post

* 修改 post

* 删除会采用 post/get

* 查找  get

* 外国人   post  delete put get
增  删    改  查

* ResultFul 风格

Controller 返回值

4种

1. ModelAndView

既可以控制页面的跳转,也可以实现数据的封装

2. Void

想使用servlet原生态的开发方式

3. String

才是官方推荐的

可以控制页面的跳转

@RequestMapping("/strDemo")
public String strDemo(Model model){
    model.addAttribute("name","list");
    return "redirect:/index.jsp";
}

数据的封装需借助model,在方法中写上参数model,调用model的addAttribute的方法实现数据封装

页面跳转的方式:默认是转发

       重定向:”redirect:/index.jsp”
        转发:”forward:/index.jsp”

4. Json

对比json技术的优劣(fast json  jackson json)

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.9.4</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.4</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.9.4</version>
</dependency>

在springmvc开启  转换方法

可以省略里面转换器,加上<mvc:annotation-driven> 自动转换成json格式

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
    </mvc:message-converters>
</mvc:annotation-driven>

ssm框架整合

spring跟mybatis整合

spring 跟 springmvc

导包

Mybatis  log4j

实际上就是把 spring和mybatis放到web里面中

Web.xml 要配置项目启动就读取spring 配置文件

拦截器

自定义的拦截器

相当于原来的过滤器的作用,在访问目标controller之前,先访问过滤器

自定义一个类去实现三个方法

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println("方法调用前执行");
    return true;
}

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
   //执行controller之后调用
}

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
   //页面渲染之后调用
}

再把自定义的拦截器,配置到springmvc核心配置文件中

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/sys/*"/>
        <bean class="com.hd.interceptor.MyInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

Springmvc 实现文件上传

Springmvc提供的方式

Spring提供的方式(推荐)

 

导包:  文件上传  需要依赖

         Commons-io

         Commons-fileupload

书写前端页面

Form表单提交

请求方式:post

Enctype:必须要是multipart

 

将上述代码,添加到controller方法中

//将当前上下文初始化给  CommonsMutipartResolver (多部分解析器)
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
        request.getSession().getServletContext());
//检查form中是否有enctype="multipart/form-data"
if (multipartResolver.isMultipart(request)) {
    //将request变成多部分request
    MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
    //获取multiRequest 中所有的文件名
    Iterator iter = multiRequest.getFileNames();

    while (iter.hasNext()) {
        //一次遍历所有文件
        MultipartFile file = multiRequest.getFile(iter.next().toString());
        if (file != null) {
            //获取文件的后缀名
            String expresion = "";
            int i = file.getOriginalFilename().lastIndexOf(".");
            if (i != -1) {
                expresion = file.getOriginalFilename().substring(i + 1);
            }
            //拼接生成新的文件的名字使用随机数
            String path = UUID.randomUUID().toString() + "." + expresion;
            //上传并保存到服务器的对应地址下
            file.transferTo(new File(request.getServletContext().getRealPath("/upload/" + path)));
            System.out.println(path);
            map.put("path", path);
           }
        }
    }

异常处理器:

写个类 实现handlerExceptionResovler接口

并实现这个接口的方法

public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, @Nullable Object o, Exception e) {
    ModelAndView mav = new ModelAndView();
    mav.addObject("error","未知错误");
    mav.setViewName("/error.jsp");
    return mav;
}

需要在springmvc.xml文件中配置这个类

<bean class="com.hd.exception.MyExceptionHandler"></bean>

类型转换器:

日期类型

yyyy-MM-dd HH:mm:ss类型

mvc的父子工程:

根据传统分层:

一个父工程起到聚合的作用,将所有的子工程聚合到一起,子工程相对独立开发

4个子项目(web(controller)  service  dao  entity)

根据业务模块分层

 

父子工程的创建:

建立一个maven项目,将该项目作为父工程

需要更改父工程的打包方式

为该工程建立子工程

右击父工程: new一个module

更改子工程的打包方式,默认继承父工程

一个父工程可以建立多个子工程

子工程是完全独立的,如果自工程之间需要依赖关系,直接在子工程的pom.xml文件中加入其他工程的依赖即可

整个项目的技术架构依赖放在父工程中

 

粗减的话语,希望大家看了不要嫌弃,有什么错,望留言更正!!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值