【SpringMVC】基础、环境搭建、注解搭建、 and so on……
创始人
2024-01-20 20:47:36
0

文章目录

    • SpringMVC
      • 【原理】:
      • 一、why?:
      • 二、环境搭建(配置方式):
        • ▶1.导入jar包
        • ▶2.创建简单测试----创建Controller类继承AbstractController
        • ▶3.如何读取Controller文件,创建SpringMVC.xml配置文件,映射Controller
        • ▶4.在web.xml中读取SpringMVC.xml配置文件
        • ▶5.项目加入Tomcat(Tomcat应该都配置好了,前期Maven有教程)。
        • ▶6.此处没有项目,只是测试我们的Controller是否可以读取,springMVC配置是否完成
      • 三、注解驱动控制器Controller(注解方式)
        • ▶1.web.xml
        • ▶2.SpringMVC.xml配置(头部关于context的命令)
        • ▶3.Controller,不需要继承
      • 四、关于@RequestMapping()
      • 五、关于@RequestParam()传参
      • 六、传对象
      • 七、参数传递(作用域):
        • 1.加注解@ModelAttribute
        • 2.new ModelAndView()
        • 3.model
        • 4.map
        • 5.@SessionAttributes
        • 6.转发与重定向
      • 八、@ResponseBody返回json数据
        • 1.@JsonSerialize(include)空值不返回
        • 2.@JsonSerialize(using)处理前后端对状态类字段不统一,需转换
        • 3.关于Date时间数据类型格式化
      • 九、视图解析器
      • 十、REST风格

SpringMVC

springMVC是一种基于Java实现MVC模型的轻量级Web框架

  • 是一种表现层框架技术
  • 用于进行表现层功能开发

【原理】:

【原理每个人的理解不一样,面试考】
在这里插入图片描述

一、why?:

【重点解决的是servlet问题】以前一个请求写一个servlet,违背了面向对象的原则,都是操作一个模块,却写了很多servlet,麻烦。
创建一个Controller类,请求多个方法,一个模块的执行可以写一个类文件。

二、环境搭建(配置方式):

▶1.导入jar包

  4.0.2.RELEASE
  org.springframeworkspring-web${spring.version}org.springframeworkspring-webmvc${spring.version}	javax.servletservlet-api2.5javax.servlet.jspjsp-api2.2

▶2.创建简单测试----创建Controller类继承AbstractController

//创建IndexController.java类,继承AbstractController,会重写方法
public class IndexController extends AbstractController {@Overrideprotected ModelAndView handleRequestInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {System.out.println("测试输出====");//return返回的试图就是页面return new ModelAndView("index.jsp");}
}

▶3.如何读取Controller文件,创建SpringMVC.xml配置文件,映射Controller

命令空间有两个没有用到,后续会用的。-------看注释



▶4.在web.xml中读取SpringMVC.xml配置文件


Archetype Created Web ApplicationspringMVC  org.springframework.web.servlet.DispatcherServlet contextConfigLocationclasspath:SpringMVC.xml 1 springMVC/

▶5.项目加入Tomcat(Tomcat应该都配置好了,前期Maven有教程)。

【▲注意:启动服务器,要想浏览器可以直接打开项目,下图:如果“/”后还有东西,在浏览器地址要加上“/”后面的名称。】
在这里插入图片描述

▶6.此处没有项目,只是测试我们的Controller是否可以读取,springMVC配置是否完成

在这里插入图片描述
在这里插入图片描述


三、注解驱动控制器Controller(注解方式)

上面我们发现执行Controller依旧很麻烦,所以项目一般使用注解进行

▶1.web.xml

和上面一样,它 是读取配置文件的,一直需要。

▶2.SpringMVC.xml配置(头部关于context的命令)




▶3.Controller,不需要继承

  • @Controller:标注一个普通的JavaBean成为可以处理请求的控制器

  • @RequestMapping:通过请求URL进行映射,可以写在方法上,也可以写在类上表示整个模块

@Controller    //必须有
//@RequestMapping("/indexController")
public class IndexController {
//这样可以写多个方法====//在方法上注解//方法一:@RequestMapping("/index")public ModelAndView index() {System.out.println("index方法~~~~");return new ModelAndView("index.jsp");}//方法二:@RequestMapping("/aaa")public ModelAndView aaa() {System.out.println("aaaa方法~~~~");return new ModelAndView("index.jsp");}
}

四、关于@RequestMapping()

  • ▶标识在类上:标识这一个模块,区别两个模块中的重复方法

  • ▶标识在方法上:作为路径

    • 拥有属性method

      method:
      RequestMethod.GET------必须以GET方式进入 @GetMapping
      RequestMethod.POST----必须以POST方式进入 @PostMapping

  • ▶传参:

    @Controller
    @RequestMapping("/provider")
    public class ProviderController {@RequestMapping(value = "/index",method = RequestMethod.GET)//直接传参public ModelAndView index(String proName,String proCode) {System.out.println("proName=="+proName);System.out.println("proCode=="+proCode);return new ModelAndView("/index.jsp");}
    }
    
  • ▶拥有属性params:请求参数的映射条件,指定请求的URL地址需要带那些参数:params={ “param1=value1” , “param2” , “!param3” --不传}

    • 必须要传的值
      @Controller
      @RequestMapping("/provider")
      public class ProviderController {//此时proName必须传@RequestMapping(value = "/index",method = RequestMethod.GET,params = {"proName"})public ModelAndView index(String proName,String proCode) {System.out.println("proName=="+proName);System.out.println("proCode=="+proCode);return new ModelAndView("/index.jsp");}
      }
      

五、关于@RequestParam()传参

  • 属性value传递参数的别名;
  • 属性required是否必须传此参数,默认false;
  • 属性defaultValue设置默认值
  • 必须传的值required = true与设置默认值defaultValue="0000"是冲突的
  • 不管是Integer类型还是String类型,传递默认值都要加引号
   public ModelAndView index(@RequestParam(value = "pName",required = true) String proName,String proCode,@RequestParam(value = "id",defaultValue = "1")Integer id) {System.out.println("proName=="+proName);System.out.println("proCode=="+proCode);return new ModelAndView("/index.jsp");}

在这里插入图片描述

六、传对象

要加入实体类


供应商编号:
供应商名称:
@RequestMapping(value = "/testProvider",method = RequestMethod.POST)public ModelAndView saveProvider(Provider provider) {System.out.println(provider.toString());return new ModelAndView("/index.jsp");}

在这里插入图片描述

七、参数传递(作用域):

【前四种是request域,最后一个是session作用域】

1.加注解@ModelAttribute

@Controller
public class IndexController {@RequestMapping("/index1")//uname放入request作用域public ModelAndView index(@ModelAttribute("uname") String uname) {System.out.println("uname==="+uname);return new ModelAndView("/index.jsp");}
}

2.new ModelAndView()

@Controller
public class IndexController {@RequestMapping("/index2")public ModelAndView index() {//自定义数据放域String msg = "这是IndexController类";ModelAndView mv = new ModelAndView("/index.jsp");mv.addObject("msg",msg);//mv.setViewName("视图名");return mv;}
}

3.model

    @RequestMapping("/index3")public String index1(Model model){model.addAttribute("user_name","张三");return "/index.jsp";}

4.map

    @RequestMapping("/index4")public String index2(Map map){map.put("user_name","789");return "/index.jsp";}

【注意:使用EL表达式加-----isELIgnored="false"】

//index.jsp 测试上面request作用域传值
<%@ page contentType="text/html;charset=UTF-8" isELIgnored="false" language="java" %>


首页~Hello World!

${uname}
${msg}
${user_name}

【开启服务器,访问 @RequestMapping("/index~")等路径测试作用域】

5.@SessionAttributes

【@SessionAttributes只能定义在类上,作用是将指定的Model中的键值对添加至session中】

  • @SessionAttributes(types=User.class)会将model中所有类型为 User的属性添加到会话中。
  • @SessionAttributes(value={“user1”, “user2”}) 会将model中属性名为user1和user2的属性添加到会话中。
  • @SessionAttributes(types={User.class, Dept.class}) 会将model中所有类型为 User和Dept的属性添加到会话中。
  • @SessionAttributes(value={“user1”,“user2”},types={Dept.class})会将model中属性名为user1和user2以及类型为Dept的属性添加到会话中。
@Controller
@SessionAttributes(value = {"name"}) //与Model中的键key保持一致
public class IndexController {@RequestMapping("/index0")public ModelAndView index0(String user_name){ModelAndView mv = new ModelAndView("/index.jap");//存入Request作用域和Session作用域mv.addObject("name",user_name);return mv;}
}

在这里插入图片描述
在saveProvider.jsp获取数据测试数据是否保存在session中${name}

在这里插入图片描述

6.转发与重定向

【return默认是转发,重定向放在request的值拿不到 】

public String test(User user)
{.....return "redirect:/user.jsp";  //重定向return "forward:页面";        //转发 
}

八、@ResponseBody返回json数据

@ResponseBody这个注解通常使用在控制层(controller)的方法上,其作用是将方法的返回值以特定的格式写入到response的body区域,进而将数据返回给客户端。当方法上面没有写ResponseBody,底层会将方法的返回值封装为ModelAndView对象。

  • 假如是字符串则直接将字符串写到客户端。如果返回String,默认按iso8859-1编码,页面可能出现乱码。因此在注解中我们可以手动修改编码格式,例如@RequestMapping(value=“/路径”,produces=“text/html;charset=utf-8”),前面是请求的路径,后面是编码格式。

  • 假如是一个对象,此时会将对象转化为json串然后写到客户端,返回对象,按utf-8编码。

  • 可以加在类上,下面的所有方法数据返回json
  • 加在方法上,设置当前控制器方法响应内容为当前返回值,无需解析
  • 使用前先导坐标
    com.fasterxml.jackson.corejackson-core2.4.3com.fasterxml.jackson.corejackson-databind2.4.3
    
  • 使用类上的时候:@RestControlle相当于@Controller+@ResponseBody,直接使用@RestControlle即可。
@Controller
//@ResponseBody     //给下面所有方法返回JSON
//@RestController   //相当于@Controller+@ResponseBody
public class IndexController {/*** 对象返回JSON* @return*/@RequestMapping("/findProviderJSON")@ResponseBody    //自动返回jsonpublic Provider findProviderJSON() {Provider provider= new Provider();provider.setProCode("7811");provider.setProName("三百七七");return provider;}/*** 集合返回对象* @return*/@RequestMapping("/findProListJSON")@ResponseBody    //自动返回json,就不会返回页面public List findProListJSON(){List provider = new ArrayList();Provider provider1 = new Provider();provider1.setProName("朱尔斯");provider1.setCreationDate(new Date());Provider provider2 = new Provider();provider2.setProName("Jules");provider2.setCreationDate(new Date());provider.add(provider1);provider.add(provider2);return provider;}

对象返回JSON

在这里插入图片描述
集合返回JSON

在这里插入图片描述

1.@JsonSerialize(include)空值不返回

【看测试图发现没有传的值会返回null,对象中添加@JsonSerialize(),表示空值null不返回】

实体类上添加:
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
表示属性为null不返回

2.@JsonSerialize(using)处理前后端对状态类字段不统一,需转换

【@JsonSerialize注解,主要用于数据转换,该注解作用在该属性的getter()方法上。】

【1.实体类上在需要装换的字段上加上注解】

/*** 文字型状态值*/
@JsonSerialize(using = MySerializerUtils.class)
private int status;

【2.负责转化的类的规则】

public class MySerializerUtils extends JsonSerializer {@Overridepublic void serialize(Integer status, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {String statusStr = "";switch (status) {case 0:statusStr = "暂存";break;case 1:statusStr = "待上报";break;case 2:statusStr = "待审核";break;case 3:statusStr = "已审";break;case 4:statusStr = "退回";break;case -1:statusStr = "已删";break;default:statusStr = "状态信息不符合";}jsonGenerator.writeString(statusStr);}
}

http://www.qb5200.com/article/406882.html

3.关于Date时间数据类型格式化

时间格式化,否则是一串数字:

  • @DateTimeFormat(pattern=" ") 入参时间格式化
  • @JsonFormat(pattern=" ") 输出时间格式化
  • timezone = “GMT+8”,我们在页面显示的时间与北京时间相差8个小时,加timezone处理时差
	//@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")  //入参不乱//@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")  //返回json的时候防止时间乱@Setter@Getter@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private Date creationDate; //创建时间

【但在项目中时间一般用String类型】

九、视图解析器

【在return路径的时候,我们可以省略“/”和“.jsp”,jsp文件名mv.setViewName("index") , 这就需要视图解析器的前缀后缀】
在这里插入图片描述
springMVC.xml中


//前缀:jsp文件所在的路径

看图理解前缀路径如何写的
在这里插入图片描述

十、REST风格

在我们访问一些网站的时候会发现,它的最后有一串数字,或者数字.html,这是如何实现的呢?

在这里插入图片描述

@Controller
@RequestMapping("/provider")
public class ProviderController {@RequestMapping(value = "/jules/{id}.html")public ModelAndView stylePage(@PathVariable("id") Integer id) {System.out.println("id======"+id);return new ModelAndView("index");}
}//请求路径为:http://localhost:8080/provider/jules/11.html
//@RequestMapping(value = "/jules/{id1}/{id}.html") 也可以传多个

在这里插入图片描述
【后缀显示html页面实际上是我们自己的风格,页面还是jsp而已~~】

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...