栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springmvc看这篇就够了

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springmvc看这篇就够了

回顾MVC 什么是MVC?
  • MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。
  • 将业务逻辑、数据、显示分离的方法来组织代码
  • 主要作用是降低了视图与业务逻辑间的双向偶合
  • 不是一种设计模式,MVC是一种架构模式

Model:数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据Dao) 和 服务层(行为Service)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。

View:负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。

Controller:接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。也就是说控制器做了个调度员的工作。

MVC的Model1时代

Model1时代分为两层视图层和模型层;

视图层是JSP实现了,完成了上述的Controller 和 View的功能;
模型层负责业务逻辑处理;

优点:架构简单,比较适合小型项目开发;

缺点:JSP职责不单一,职责过重,不便于维护

MVC的Model2时代

Model2时代分为三个部分:视图、控制、模型

执行流程:

  1. 用户发请求
  2. Servlet接收请求数据,并调用对应的业务逻辑方法
  3. 业务处理完毕,返回更新后的数据给servlet
  4. servlet转向到JSP,由JSP来渲染页面
  5. 响应给前端更新后的页面

各个部分的职责分析:

  1. Controller
  • 取得表单数据
  • 调用业务逻辑
  • 转向指定的页面
  1. Model
  • 业务逻辑
  • 保存数据的状态
  1. View
  • 显示页面
总结:

Model2这样不仅提高的代码的复用率与项目的扩展性,且大大降低了项目的维护成本。

Model 1模式的实现比较简单,适用于快速开发小规模项目,Model1中JSP页面身兼View和Controller两种角色,将控制逻辑和表现逻辑混杂在一起,从而导致代码的重用性非常低,增加了应用的扩展性和维护的难度。Model2消除了Model1的缺点。

SprinMVC初识 简介:

Spring MVC是Spring framework的一部分,是基于Java实现MVC的轻量级Web框架。

SpringMVC的优点:

  • 轻量级,简单易学
  • 高效 , 基于请求响应的MVC框架
  • 与Spring兼容性好,无缝结合
  • 约定优于配置
  • 功能强大:RESTful、数据验证、格式化、本地化、主题等
  • 简洁灵活
servlet示例

首先我们新建一个普通的maven的工程,这个工程作为父工程

将src给删除,方便后面创建子项目

新建一个子项目也是普通的maven工程,新建完后项目右键Add framework Support选择web-app,一个web工程就构建好了

第一步:在父工程的pom.xml文件中导入了依赖


    
        junit
        junit
        4.12
    
    
        org.springframework
        spring-webmvc
        5.3.4
    
    
        javax.servlet
        servlet-api
        2.5
    
    
        javax.servlet
        jsp-api
        2.0
    
    
        javax.servlet
        jstl
        1.2
    

子工程的pom.xml文件中:

dependencies>
    
        javax.servlet
        servlet-api
        2.5
    
    
        javax.servlet.jsp
        jsp-api
        2.2
    

准备工作我们都做的差不多了,来写具体的代码

首先我们先写一个创建一个form.jsp文件


编写一个servlet类,用来处理用户的请求

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取前端参数
        String method = req.getParameter("method");
        if (method.equals("add")){
            req.getSession().setAttribute("msg","执行了add的方法");
        }
        if (method.equals("delete")){
            req.getSession().setAttribute("msg","执行了delete方法");
        }
        //2.调用业务层
        //3.视图转发或者重定向
        req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

在WEB-INF下面创建一个jsp包,在包下创建一个test.jsp文件

${msg}

配置tomcat,运行

配置第一个SpringMVC项目

第一步在web.xml文件中注册DispatcherServlet和执行顺序


    SpringMVC
    org.springframework.web.servlet.DispatcherServlet
    
    
        contextConfigLocation
        classpath:SpringMVC-servlet.xml
    
    
    1


    SpringMVC
    org.springframework.web.servlet.DispatcherServlet
    
        
        contextConfigLocation
        classpath:SpringMVC-Servlet.xml
    
    
    1



    SpringMVC
    /

接下来在我们的resource包下创建一个文件为SpringMVC-Servlet.xml文件,用来当做spring配置容器文件,这里我们不需要再注册处理器映射器和处理器适配器,只需要加一个annotation-driven配置就可完成自动注入








    
    
    
    

创建我们的Controller类进行数据的操作,我们这里直接加上Controller注解实现注册

  • @Controller是为了让Spring IOC容器初始化时自动扫描到;
  • @RequestMapping是为了映射请求路径,这里因为只有方法上有映射所以访问时应该是/h1,如果我们在类上面加上RequestMapping注解值为HelloController,则该类下的方法都会以这个类的RequestMapping的值为父级目录,也就是访问的路径为/HelloController/h1
@Controller
public class HelloController {
    @RequestMapping("/h1")
    public String hello(Model model){
        //封装数据
        model.addAttribute("msg","hello,SpringMVCAnnotation!");
        //跳转到的文件名称
        return "hello";
    }
}

创建我们的WEB-INF下的创建一个包为加jsp,在jsp包下创建hello.jsp,作为展示视图

${msg}
RestFul风格

概念:

RestFul就是一个资源定位及资源操作的风格,不是标准也不是协议,只是一种风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制

具体的实现:

新建一个控制类:

@Controller
public class RestFulController {
    @RequestMapping(name = "/t2")
    public String add(int a,int b, Model model){
        int sum = a+b;
        model.addAttribute("msg","a+b的结果为:"+sum);
        return "test1";
    }
}

原始的地址栏方式:http://localhost:8080/SpringMVC_04_controller/t2?a=1&b=2

RestFul风格的方式:http://localhost:8080/SpringMVC_04_controller/t2/1/2

第一种方式RequestMapping:

@PathVariable可以获取RequestMapping中大括号里所需的值

method:可以指定请求的方式

@Controller
public class RestFulController {
    //原始方式:http://localhost:8080/SpringMVC_04_controller/t2?a=1&b=2
    //RestFul方式:http://localhost:8080/SpringMVC_04_controller/t2/1/2
    @RequestMapping(value = "/t2/{a}/{b}",method = RequestMethod.GET)
    public String add(@PathVariable int a,@PathVariable int b, Model model){
        int sum = a+b;
        model.addAttribute("msg","a+b的结果为:"+sum);
        return "test1";
    }
}
第二种方式直接通过对应的注解:

直接用GetMapping注解或者PostMapping注解实现:

@Controller
public class RestFulController {
    @GetMapping("/t2/{a}/{b}")
    public String add(@PathVariable int a,@PathVariable int b, Model model){
        int sum = a+b;
        model.addAttribute("msg","a+b的结果为:"+sum);
        return "test1";
    }
}
重定向和转发

具体实现:

默认的是请求转发,可以省略forward,重定向需要加上redirect,在使用重定向时,需要将视图解析器关闭,否则会出现404

@Controller
public class ModelTest1 {
    @RequestMapping("/t3")
    public String test1(Model model) {
        model.addAttribute("msg", "hello");
        //重定向:地址改变
//        return "redirect:index.jsp";
        //转发:地址不变
        return "forward:/WEB-INF/jsp/test1.jsp";
    }
}
提交的域名称和处理方法的参数名不一致

当传入的参数名和处理方法的参数名不一致时,可以使用RquestParam注解来取别名

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/t4")
    public String test(@RequestParam("username")String name, Model model) {
        System.out.println("接收前端发送过来的参数:" + name);
        model.addAttribute("msg", name);
        return "test1";
    }
}
提交的是一个对象

要求提交的表单域和对象属性一致,参数使用对象即可,直接在地址栏上进行拼接,spring会一一进行对应

前端传入的参数名和对象的属性名必须一致,否则会报null

@RequestMapping("/t5")
public String test2(User user,Model model){
    model.addAttribute("msg",user.toString());
    System.out.println(user.toString());
    return "test1";
}
乱码问题解决方式

方式一:

我们可以使用配置过滤器来解决:

创建一个新的类,命名为EncodingFilter,继承我们的Filter类

public class EncodingFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");

        chain.doFilter(request,response);
    }

    public void destroy() {

    }
}

在web.xml进行注册配置


    encoding
    com.xsq.filter.EncodingFilter

    
        encoding
        /*
    

方式二:

在我们的web.xml文件下直接加上如下代码:


    spring filter
    
        org.springframework.web.filter.CharacterEncodingFilter
    
    
        encoding
        utf-8
    


    spring filter
    /*

json格式转换

前端代码转换:


输出结果:

{“name”:“二哈”,“age”:3,“sex”:“男”}

============================

{name: “二哈”, age: 3, sex: “男”}

Jackson使用

加入jackson的依赖


    
        com.fasterxml.jackson.core
        jackson-databind
        2.12.1
    
    
        io.mateu
        lombok
        1.18.11.97
    

为了防止json乱码,在spring配置容器文件中加入乱码解决配置


    
        
            
        
        
            
                
                    
                
            
        
    

创建controller类,这里加ResponseBody标签表示不走视图解析器,直接返回一个字符串,配合Controller注解来使用,如果类上有RestController,就没有必要在方法上再加ResponseBody了,因为RestController本身就表示不走视图解析器,直接返回一个字符串

//@Controller
@RestController
public class UserController {
    @RequestMapping(value = "/t")
//    @ResponseBody//表示不走视图解析器,直接返回一个字符串,配合Controller来使用的
    public String test() throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        User user = new User("二哈", 18, "男");
        String str = mapper.writevalueAsString(user);
        return str;
    }
Fastjson使用

Fastjson是由阿里的大佬开发编写的,需要导入包


    com.alibaba
    fastjson
    1.2.75

测试一下:

@RequestMapping(value = "/t3")
public String test3(){
    List userList = new ArrayList();
    User user1 = new User("二哈",18,"男");
    User user2 = new User("二哈",18,"男");
    User user3 = new User("二哈",18,"男");
    User user4 = new User("二哈",18,"男");
    userList.add(user1);
    userList.add(user2);
    userList.add(user3);
    userList.add(user4);
    String str = JSON.toJSONString(userList);
    return str;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/434712.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号