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

SpringMVC学习基础总结

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

SpringMVC学习基础总结

目录:

一、MVC回顾二、Servlet回顾三、什么是SpringMVC四、SpringMVC执行原理五、使用注解开发SpringMVC六、RestFul风格七、接收请求参数和数据回显八、解决乱码问题

决解json乱码问题 九、Jackson、Fastjson的使用的使用


一、MVC回顾

Model(模型): 数据模型,提供要展示的数据,分为数据Dao和服务层Servide,提供数据查询和模型数据的状态更新。
View(视图): 负责进行模型的展示,也就是用户界面。
Controller(控制层): 接受用户请求,委托模型进行处理,处理完后将返回的模型数据返回给视图。

MVC框架要做的事情:
① 将url映射到java类或者java的方法;
② 封装用户提交的数据;
③ 处理请求 ---- 调用相关业务处理 ---- 封装响应数据;
④ 将响应的数据进行渲染;


二、Servlet回顾

创建一个Maven项目
新建 ----> 选择Maven ----> Next ----> 填写名称 ----> 完成;
删除src
导入依赖:


     
         junit
         junit
         4.12
     

     
         org.springframework
         spring-webmvc
         5.1.9.RELEASE
     

     
         javax.servlet
         servlet-api
         2.5
     

     
         javax.servlet.jsp
         jsp-api
         2.2
     

     
         javax.servlet
         jstl
         1.2
     
 



在子项目的java中创建一个继承HttpServlet的类。

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方法");
        }else 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.xml中配置servlet


    hello
    com.nzs.servlet.HelloServlet


    hello
    /hello






    15



    index.jsp

配置tomcat

执行


三、什么是SpringMVC

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

Spring MVC的特点:
① 轻量级、简单易学,简洁灵活;
② 高效,基于请求响应的MVC框架;
③ 与Spring兼容性好;
④ 约定优于配置;
⑤ 功能强大:RESTFul、数据验证、格式化、本地化、主题等;
DispatcherServlet:
① Spring的web框架围绕DispatcherServlet设计。DispatcherServlet的作用就是将请求分发到不同的处理器,DispatcherServlet是一个实际的Servlet。

SpringMVC实例:
① 新建一个Moudel,添加web支持;
② 确导入SpringMVC的依赖;
③ 配置web.xml,注册DispatcherServlet;




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

   
       springmvc
       /
   

④ resources文件下创建【servlet-name】-servlet.xml;




   
   
   
   
   
   
       
       
       
       
   


   
   


⑤ 编写业务Controller,要么实现Controll接口,要么添加注解;需要返回一个ModelAndView,装数据,封视图。

public class HelloController implements Controller {
   @Override
   public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
       //1.modelAndView 模型和视图
       ModelAndView mv = new ModelAndView();
       //2.封装对象,放在ModelAndView中
       mv.addObject("msg","HelloSpringMVC!!!!!");
       //3.封装要跳转的视图,放在ModelAndView中
       mv.setViewName("hello"); // :/WEB_INF/jsp/hello.jsp
       return mv;
   }
}

⑥ 将自己的类交给SpringIOC容器,在pringmvc-servlet.xml注册bean;

   
   

如果404,则需要下面操作:


四、SpringMVC执行原理

执行流程:
① DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接受请求并拦截请求。
② HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping;HandlerMapping根据请求url查找Handler。
③ HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为:hello
④ HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。
⑤ HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
⑥ Handler让具体的Controller执行。
⑦ Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。
⑧ HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
⑨ DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
⑩ 视图解析器将解析的逻辑视图名传给DispatcherServlet。
① DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
② 最终视图呈现给用户。


五、使用注解开发SpringMVC

① 在pom.xml中加入

   
       
           
               src/main/java
               
                   ***.xml
               
               false
           

           
               src/main/resources
               
                   ***.xml
               
               false
           
       
   

② 添加web支持,将jar包加入打包中;然后配置web.xml;

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


   
       springmvc
       /
   

③ 创建springmvc-servlet.xml





   
   


   
   


   
   


   
   id="internalResourceViewResolver">
       
       
       
       
   


④ 创建一个controller

@Controller
public class HelloControll {

   @RequestMapping("/hello")
   public String hello(Model model){
       //封装数据
       model.addAttribute("msg","通过注解开发SpringMVC");
       return "hello";
   }
}


六、RestFul风格

好处:
① 使得路径更加整洁、安全;
② 获得参数更加方便,框架会自动进行类型装换;
③ 通过路径变量的类型可以约束访问参数,如果类型不一样,则访问不到对应的请求方法;

实例:
① 新建一个RestFulController
② 在SpringMVC中使用@PathVariable注解,让方法参数值对应绑定到一个URL模板变量上;

@Controller
public class RestFulController {
   @RequestMapping("/add/{a}/{b}")
   public String test(@PathVariable int a,@PathVariable int b, Model model){
       int res = a + b;
       model.addAttribute("msg","a + b = "+res);
       return "hello";
   }
}


通过注解设置不同请求方式的响应方法:

@RequestMapping(path = "/add/{a}/{b}",method = {RequestMethod.GET})
或者
@GetMapping("/add/{a}/{b}")
七、接收请求参数和数据回显

① Model:精简版,只有寥寥几个方法,只适合存储数据;
②ModelMap:继承了linkedMap,除了实现了自身的一些方法,同样继承linkeMap的方法和特性;
③ ModelAndMap:可以存储数据的同时,可以进行设置返回的逻辑视图,进行控制层的跳转;

1. 提交的域名称和处理方法的参数一致:

   @RequestMapping("/hello")
   public String test1(String name){
        System.out.println(name);
        return "hello";
   }

2. 提交的域名称和处理方法的参数不一致:

   @RequestMapping("/hello")
   public String test1(@RequestParam("username") String name){
       System.out.println(name);
       return "hello";
   }

3. 提交的是一个对象:

   @RequestMapping("/index")
   public String userIndex(User user , Model model){
       //1.接收前端参数
       System.out.println(user);
       //2.将返回的结果返回
       model.addAttribute("msg","----------"+user);
       return "user";
   }
八、解决乱码问题

过滤器决解;

① 在web.xml中配置乱码过滤器;

   
   
       encoding
       org.springframework.web.filter.CharacterEncodingFilter
       
           encoding
           utf-8
       
   
   
       encoding
       /*
   

②如果通过上面还不能决解,则修改Tomcat配置文件:设置编码;

修改service.xml

   

③ 如果通过上面还不能决解,则自定义乱码过滤器;

public class GenericEncodingFilter implements Filter {

   @Override
   public void destroy() {
   }

   @Override
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
       //处理response的字符编码
       HttpServletResponse myResponse=(HttpServletResponse) response;
       myResponse.setContentType("text/html;charset=UTF-8");

       // 转型为与协议相关对象
       HttpServletRequest httpServletRequest = (HttpServletRequest) request;
       // 对request包装增强
       HttpServletRequest myrequest = new MyRequest(httpServletRequest);
       chain.doFilter(myrequest, response);
   }

   @Override
   public void init(FilterConfig filterConfig) throws ServletException {
   }
}

//自定义request对象,HttpServletRequest的包装类
class MyRequest extends HttpServletRequestWrapper {

   private HttpServletRequest request;
   //是否编码的标记
   private boolean hasEncode;
   //定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰
   public MyRequest(HttpServletRequest request) {
       super(request);// super必须写
       this.request = request;
   }

   // 对需要增强方法 进行覆盖
   @Override
   public Map getParameterMap() {
       // 先获得请求方式
       String method = request.getMethod();
       if (method.equalsIgnoreCase("post")) {
           // post请求
           try {
               // 处理post乱码
               request.setCharacterEncoding("utf-8");
               return request.getParameterMap();
           } catch (UnsupportedEncodingException e) {
               e.printStackTrace();
           }
       } else if (method.equalsIgnoreCase("get")) {
           // get请求
           Map parameterMap = request.getParameterMap();
           if (!hasEncode) { // 确保get手动编码逻辑只运行一次
               for (String parameterName : parameterMap.keySet()) {
                   String[] values = parameterMap.get(parameterName);
                   if (values != null) {
                       for (int i = 0; i < values.length; i++) {
                           try {
                               // 处理get乱码
                               values[i] = new String(values[i]
                                       .getBytes("ISO-8859-1"), "utf-8");
                           } catch (UnsupportedEncodingException e) {
                               e.printStackTrace();
                           }
                       }
                   }
               }
               hasEncode = true;
           }
           return parameterMap;
       }
       return super.getParameterMap();
   }

   //取一个值
   @Override
   public String getParameter(String name) {
       Map parameterMap = getParameterMap();
       String[] values = parameterMap.get(name);
       if (values == null) {
           return null;
       }
       return values[0]; // 取回参数的第一个值
   }

   //取所有值
   @Override
   public String[] getParameterValues(String name) {
       Map parameterMap = getParameterMap();
       String[] values = parameterMap.get(name);
       return values;
   }
}
   
   
       encoding
       com.nzs.springmvc.filter.GenericEncodingFilter
   
   
       encoding
       /*
   
决解json乱码问题

    
        
            
        
        
            
                
                    
                
            
        
    


九、Jackson、Fastjson的使用的使用

Jackson使用 :

① 导入jar包;

       
       
           com.fasterxml.jackson.core
           jackson-databind
           2.11.4
       

② @ResponseBody不会走视图解析器,直接返回一个字符串;@RestController下面所有都只返回字符串;

   @RequestMapping("/json1")
   @ResponseBody
   public String jsonText() throws JsonProcessingException {
       ObjectMapper mapper = new ObjectMapper();//jackson
       User user = new User(1,"11",1);
       String str = mapper.writevalueAsString(user);
       return str;
   }

③ 决解json乱码问题;(代码在上面)

Fastjson使用:

① 导入依赖;

       
       
           com.alibaba
           fastjson
           1.2.36
       

② 使用

   @RequestMapping("/json1")
   public String jsonText(){
       User user = new User();
       // 1.Java对象转JSON字符串
       String str = JSON.toJSONString(user);
       //2.JSON对象转Java对象
       JSON.parseObject(str,User.class);
       //3.Java对象转JSON对象
       JSonObject o = (JSONObject)JSON.toJSON(user);
       //4.JSON对象转Java对象
       User user1 = JSON.toJavaObject(o, User.class);
       return "hell0";
   }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/762491.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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