Spring MVC开发流程

1.Spring MVC环境基本配置

  1. Maven工程依赖spring-webmvc
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.9.RELEASE</version>
</dependency>
  1. web.xml配置DispatcherServlet映射
	<servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--applicationContext.xml--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></init-param><!--启动时加载,在Web应用启动时自动创建Spring IoC容器,并初始化DispatcherServlet--><load-on-startup>0</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><!--/ 代表拦截所有请求--><url-pattern>/</url-pattern></servlet-mapping>
  1. 配置applicationContext的mvc标记
<context:component-scan base-package="springmvc"></context:component-scan>
<!--启动Spring MVC的注解开发模式-->
<mvc:annotation-driven/>
<!--将图片/JS/CSS等静态资源排除在外,提高执行效率-->
<mvc:default-servlet-handler/>
  1. 开发Controller控制器
@Controller
public class TestController {@GetMapping("/t") //localhost:8080/t请求接收@ResponseBody  //直接向响应输出字符串数据,不跳转页面public String test(){return "SUCCESS";}
}

2.Spring MVC处理流程

在这里插入图片描述

3.Spring MVC数据绑定

完成请求数据和处理方法的绑定。

3.1 URL Mapping

URL映射,将URL和Controller方法绑定。

注解

  • @RequestMapping -通用绑定
  • @GetMapping -绑定Get请求
  • @PostMappding -绑定Post请求
@Controller
@RequestMapping("/test")//进行URL的全局设置,增加URL访问前缀
public class URLMappingController {//@RequestMapping("/g") 作用在方法上,不区分get/post请求//@RequestMapping(value="/g",method= RequestMethod.GET) 只对get请求生效@GetMapping("/g")@ResponseBodypublic String getMapping(){return "This is get method";}@PostMapping("/p")@ResponseBodypublic String postMapping(){return "This is post method";}
}

3.2 接收请求参数

有两种方法:

  1. 使用Controller方法参数接收
  2. 使用Java Bean实体对象接收

使用Controller方法参数接收

保证参数名一致就可以自动匹配,还可以进行参数类型的自动转换。

参数名不一致时,可以通过@RequestParm注解自定义匹配。

利用@RequestParam可以为参数设置默认值,如:@RequestParam(value="n",defaultValue = "ANON")String name,不会按照name去查找,而是会按照n去查找,没有匹配到,会给n设置默认值为ANON。

<form action="/test/p" method="post"><input name="username"/><br/><input name="password"/><input name="manager_name"/><input type="submit" value="提交"/>
</form>
 @PostMapping("/p")@ResponseBodypublic String postMapping(String username,Long password,@RequestParam("manager_name")String managerName){System.out.println(username+":"+password+":"+managerName);return "This is post method";}

使用Java Bean实体对象接收

保证参数名和对象的属性名一致就可以自动完成对象的创建和属性的注入。

    @PostMapping("/p1")@ResponseBodypublic String postMapping1(User user){System.out.println(user.getUsername()+":"+user.getPassword());return "This is post method";}

使用数组或List接收请求中的复合数据:

使用数组:

public class FormController {@PostMapping("/apply")@ResponseBodypublic String apply(Integer[] purpose){for (Integer p:purpose) {System.out.println(p);}return "SUCCESS";}
}

使用List集合:
需要添加@RequestParam注解

public String apply(@RequestParam List<Integer> purpose){for (Integer p:purpose) {System.out.println(p);}return "SUCCESS";
}

使用实体类+List集合,可以极大的简化实体表单数据接收的工作量。

使用Map对象接收请求参数:

但Map无法接收复合类型数据,会造成数据的丢失。

public String apply(@RequestParam Map map){System.out.println(map);return "SUCCESS";
}

可以在表单中增加关联对象,来为后台对象自动赋值:

public class Form {//关联对象必须实例化,保证能自动赋值成功private Delivery delivery = new Delivery();
}
<!--在form表单中增加关联对象名前缀-->
<h3>收货人</h3>
<input name="delivery.name" class="text">
<h3>联系电话</h3>
<input name="delivery.mobile" class="text">
<h3>收货地址</h3>
<input name="delivery.address" class="text">

日期类型转换:
(1)@DateTimeFormat(pattern="") 将前台传入的字符串按照指定格式转换为日期类型。

//方法参数:
public String date(@DateTimeFormat(pattern="yyyy-MM-dd") Date date){}
//对象属性:
public class User{@DateTimeFormat(pattern="yyyy-MM-dd") private Date date;
}

(2)开发全局日期转换类

package springmvc.converter;import org.springframework.core.convert.converter.Converter;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class MyDateConverter implements Converter<String, Date> {public Date convert(String s) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");try {Date date = sdf.parse(s);return date;} catch (ParseException e) {return null;}}
}

applicationContext.xml中配置自定义类型转换器
在这里插入图片描述
然后就可以直接转换了

public String date(Date date){...
}

以上两种同时配置时,优先转换器生效。

解决中文乱码问题

  • get请求:server.xml增加URIEncoding属性
    在这里插入图片描述

  • Post请求:web.xml配置CharacterEncodingFilter过滤器

	<filter><filter-name>characterFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>characterFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
  • Response响应:applicationContext.xml配置StringHttpMessageConverter
<mvc:annotation-driven><mvc:message-converters><bean class="org.springframework.http.converter.StringHttpMessageConverter"><property name="supportedMediaTypes"><list><value>text/html;charset=utf-8</value></list></property></bean></mvc:message-converters>
</mvc:annotation-driven>

响应结果

  • @ResponseBody -产生响应文本
  • ModelAndView -利用模版引擎渲染输出
@ResponseBody

直接产生字符串/JSON/XML类型数据响应,不涉及任何视图,受StringHttpMessageConverter影响。

ModelAndView

将数据对象和模版引擎进行绑定,Spring MVC默认View是JSP,可配置其他。

Controller:

 	@GetMapping("/view")public ModelAndView showView(Integer userId){//ModelAndView mav = new ModelAndView("/view.jsp");ModelAndView mav = new ModelAndView();mav.setViewName("/view.jsp");User user = new User();if(userId == 1){user.setUsername("lily");}else if(userId==2){user.setUsername("smith");}mav.addObject("u",user);return mav;}

view.jsp

<body><h1>I'm view page</h1><h2>Username:${u.username}</h2>
</body>

mav.addObject()方法设置的属性默认存放在当前请求中,默认使用请求转发(forward)至页面,重定向使用new ModelAndView("redirect:index.jsp")

SpringMVC整合Freemarker

1.引入freemarker依赖和spring-context-support

	<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.28</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>5.1.9.RELEASE</version></dependency>
  1. 启用Freemarker模版引擎
<bean id="ViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"><!--设置响应输出,解决中文乱码--><property name="contentType" value="text/html;charset=utf-8"/><!--指定Freemarker模版文件扩展名--><property name="suffix" value=".ftl"/></bean>

3.配置Freemarker参数

<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"><!--设置模版保存的目录--><property name="templateLoaderPath" value="/WEB-INF/ftl"/><!--其他设置项--><property name="freemarkerSettings"><props><!--设置Freemarker脚步与数据渲染时使用的字符集--><prop key="defaultEncoding">UTF-8</prop></props></property></bean>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/227957.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NSSCTF第16页(2)

[NSSRound#4 SWPU]1zweb(revenge) 查看index.php <?php class LoveNss{public $ljt;public $dky;public $cmd;public function __construct(){$this->ljt"ljt";$this->dky"dky";phpinfo();}public function __destruct(){if($this->ljt"…

day01unittest复习,断言

1.unittest 方法执行前 # def setUp(self) -> None: # print(方法执行前执行) # # def tearDown(self) -> None: # print(方法执行后执行一次) 2.unittest 类方法执行前后执行一次 classmethod def setUpClass(cls) -> None:print(类执行前执行一次)classm…

微分和导数(一)

1.微分&#xff1a; 假设我们有⼀个函数f : R → R&#xff0c;其输⼊和输出都是标量。如果f的导数存在&#xff0c;这个极限被定义为 如果f′(a)存在&#xff0c;则称f在a处是可微的。如果f在⼀个区间内的每个数上都是可微的&#xff0c;则此函数在此区间中是可微的。导数f′…

网络协议 - UDP 协议详解

网络协议 - UDP 协议详解 UDP概述UDP特点UDP的首部格式UDP校验 參考文章 基于TCP和UDP的协议非常广泛&#xff0c;所以也有必要对UDP协议进行详解。 UDP概述 UDP(User Datagram Protocol)即用户数据报协议&#xff0c;在网络中它与TCP协议一样用于处理数据包&#xff0c;是一种…

必要时进行保护性拷贝

保护性拷贝&#xff08;Defensive Copy&#xff09;是一种常见的编程实践&#xff0c;用于在传递参数或返回值时&#xff0c;创建副本以防止原始对象被意外修改。以下是一个例子&#xff0c;展示了何时进行保护性拷贝&#xff1a; mport java.util.ArrayList; import java.uti…

数据手册Datasheet解读-肖特基二极管笔记

数据手册Datasheet解读笔记1-肖特基二极管 数据手册大体结构共包含10个部分肖特基二极管-SS14第一重点关注点&#xff1a;极限值第二重点关注点&#xff1a;电气特性 数据手册大体结构共包含10个部分 1.Features一特性 2.Application一应用 3.Description一说明4.Pin Configur…

关于在Java中打印“数字”三角形图形的汇总

之前写过一篇利用*打印三角形汇总&#xff0c;网友需要查看可以去本专栏查找之前的文章&#xff0c;这里利用二维数组嵌套循环打印“数字”三角形&#xff0c;汇总如下&#xff0c;话不多说&#xff0c;直接上代码&#xff1a; /*** 打印如下数字三角形图形*/ public class Wo…

逻辑分析仪_使用手册

LA1010 1> 能干啥&#xff1f;2> 硬件连接3> 软件安装4> 参数设置4.1> 采样深度和采样率4.2> 添加协议解析器4.3> 毛刺过滤设置 1> 能干啥&#xff1f; 测量通信波形&#xff0c;并自动解析&#xff1b; 比如测量&#xff0c;UART&#xff0c;SPI&…

【DataSophon】大数据管理平台DataSophon-1.2.1安装部署详细流程

&#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&am…

java_web_电商项目

java_web_电商项目 1.登录界面2.注册界面3. 主界面4.分页界面5.商品详情界面6. 购物车界面7.确认订单界面8.个人中心界面9.收货地址界面10.用户信息界面11.用户余额充值界面12.后台首页13.后台商品增加14.后台用户增加15.用户管理16.源码分享1.登录页面的源码2.我们的主界面 1.…

在线二进制原码,补码,反码计算器

具体请前往&#xff1a;在线原码/反码/补码计算器

LLM中的Prompt提示

简介 在LLM中&#xff0c;prompt&#xff08;提示&#xff09;是一个预先设定的条件&#xff0c;它可以限制模型自由发散&#xff0c;而是围绕提示内容进行展开。输入中添加prompt&#xff0c;可以强制模型关注特定的信息&#xff0c;从而提高模型在特定任务上的表现。 结构 …

会声会影怎么使用? 会声会影2024快速掌握入门技巧

一听说视频剪辑我们就不由得联想到电影、电视等一些高端的视频剪辑技术&#xff0c;大家都觉得视频剪辑是一个非常复杂而且需要很昂贵的设备才可以完成的技术活&#xff0c;这对很多“门外汉”来说都可望而不可及。实际上&#xff0c;使用会声会影剪辑视频不仅是很多人都可以操…

【深度强化学习】策略梯度方法:REINFORCE、Actor-Critic

参考 Reinforcement Learning, Second Edition An Introduction By Richard S. Sutton and Andrew G. Barto非策略梯度方法的问题 之前的算法&#xff0c;无论是 MC&#xff0c;TD&#xff0c;SARSA&#xff0c;Q-learning&#xff0c; 还是 DQN、Double DQN、Dueling DQN…

STM32G030C8T6:使用按键控制LED亮灭(外部中断)

本专栏记录STM32开发各个功能的详细过程&#xff0c;方便自己后续查看&#xff0c;当然也供正在入门STM32单片机的兄弟们参考&#xff1b; 本小节的目标是&#xff0c;系统主频64 MHZ,采用高速外部晶振&#xff0c;通过KEY1 按键的PA0 引脚配置成中断输入引脚&#xff0c;PB9引…

写好ChatGPT提示词原则之:清晰且具体(clear specific)

ChatGPT 的优势在于它允许用户跨越机器学习和深度学习的复杂门槛&#xff0c;直接利用已经训练好的模型。然而&#xff0c;即便是这些先进的大型语言模型也面临着上下文理解和模型固有局限性的挑战。为了最大化这些大型语言模型&#xff08;LLM&#xff09;的潜力&#xff0c;关…

Spring 6(二)【IOC原理】

前言 1、IOC IoC 是 Inversion of Control 的简写&#xff0c;译为“控制反转”&#xff0c;它不是一门技术&#xff0c;而是一种设计思想&#xff0c;是一个重要的面向对象编程法则&#xff0c;能够指导我们如何设计出松耦合、更优良的程序。 1.1、控制反转 控制反转不是技术…

visual Studio MFC 平台实现图片的傅里叶变换

图片的傅里叶变换 本文主要讲解傅里叶变换的基本数学概念与物理概念&#xff0c;并本文使用visual Studio MFC 平台实现对傅里叶变换在图片上进行了应用。 一、傅里叶变换的原理 在这里推荐一篇讲得非常形象的文章通俗讲解&#xff1a;图像傅里叶变换 1.1 傅里叶变换原理的说明…

idea__SpringBoot微服务11——整合Druid数据源(新依赖)(新注解)

整合JDBC 一、导入依赖二、配置Druid————————创作不易&#xff0c;如觉不错&#xff0c;随手点赞&#xff0c;关注&#xff0c;收藏(*&#xffe3;︶&#xffe3;)&#xff0c;谢谢~~ 接着 第10的 新注解&#xff1a; ConfigurationProperties ConfigurationPropert…

【人工智能】实验四:遗传算法求函数最大值实验与基础知识

实验四&#xff1a;遗传算法求函数最大值实验 实验目的 熟悉和掌握遗传算法的原理、流程和编码策略&#xff0c;并利用遗传算法求解函数优化问题&#xff0c;理解求解流程并测试主要参数对结果的影响。 实验内容 采用遗传算法求解函数最大值。 实验要求 1. 用遗传算法求解…