Spring MVC开发流程

news2024/12/22 19:21:55

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")
    @ResponseBody
    public String getMapping(){
        return "This is get method";
    }
    @PostMapping("/p")
    @ResponseBody
    public 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")
    @ResponseBody
    public 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")
    @ResponseBody
    public String postMapping1(User user){
        System.out.println(user.getUsername()+":"+user.getPassword());
        return "This is post method";
    }

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

使用数组:

public class FormController {
    @PostMapping("/apply")
    @ResponseBody
    public 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.coloradmin.cn/o/1315165.html

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

相关文章

ubuntu安装详细步骤

一&#xff0c;先下载vmware 1&#xff0c;第一步打开上面链接 下载网址 : https://www.vmware.com/products/workstation-pro/wo rkstation-pro-evaluation.html 许可证 JU090-6039P-08409-8J0QH-2YR7F ZF3R0-FHED2-M80TY-8QYGC-NPKYF FC7D0-D1YDL-M8DXZ-CYPZE-P2AY6 ZC3T…

【数据结构第 6 章 ④】- 用 C 语言实现图的深度优先搜索遍历和广度优先搜索遍历

目录 一、深度优先搜索 1.1 - 深度优先搜索遍历的过程 1.2 - 深度优先搜索遍历的算法实现 二、广度优先搜索 2.1 - 广度优先搜索遍历的过程 2.2 - 广度优先搜索遍历的算法实现 和树的遍历类似&#xff0c;图的遍历也是从图中某一顶点出发&#xff0c;按照某种方法对图中所…

6.23删除二叉搜索树中的节点(LC450-M)

算法&#xff1a; 一共有五种可能的情况&#xff1a; 第一种情况&#xff1a;没找到删除的节点&#xff0c;遍历到空节点直接返回了找到删除的节点 第二种情况&#xff1a;左右孩子都为空&#xff08;叶子节点&#xff09;&#xff0c;直接删除节点&#xff0c; 返回NULL为根…

鸿蒙4.0开发 - DevEco Studio如何使用Previewer窗口预览器报错

DevEco Studio预览器概况在HarmonyOS应用开发过程中&#xff0c;通过使用预览器&#xff0c;可以查看应用的UI效果&#xff0c;方便开发者实时查看应用的运行效果&#xff0c;随时调整代码。 1.正常启动 打开预览器的位置在DevEco Studio编辑界面的右上角部分&#xff0c;竖排…

基于VGG-16+Android+Python的智能车辆驾驶行为分析—深度学习算法应用(含全部工程源码)+数据集+模型(三)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 模型构建3. 模型训练及保存1&#xff09;模型训练2&#xff09;模型保存 4. 模型生成1&#xff09;模型导入及调用2&#xff09;相关代码&#xff08;1&#xff09;布局文件&#xff08;2&#xff…

独立站低成本流量:优化用户体验,实现精准营销

在当今的数字化时代&#xff0c;获取流量是每个网站成功的关键。然而&#xff0c;随着竞争的加剧&#xff0c;流量获取的成本也在逐渐上升。对于许多独立站来说&#xff0c;如何低成本的获取流量变得越来越具有挑战性。本文Nox聚星将和大家探讨独立站如何通过网站优化和精准营销…

云演CTF Blog

1、啥也搞不了&#xff0c;扫目录。出来个console 2、有显示锁掉了 3、抓包&#xff0c;改返回包 改成true&#xff0c;放包 不好意思&#xff0c;不会了&#xff0c;哈哈哈哈哈哈哈哈哈 你会的话&#xff0c;请告诉我&#xff0c;大佬

软实力篇---第四篇

系列文章目录 文章目录 系列文章目录前言一、你对我们公司有什么想问的吗?二、很多人都倒在自我介绍上三、如何与 HR 交谈,如何谈薪水前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就…

docker consul容器的自动发现与注册

一、微服务&#xff08;容器&#xff09;的注册与发现——微服务架构中极其重要的组件 1、定义&#xff1a;是一种分布式管理系统以及定位服务的方法。传统架构中&#xff0c;应用程序之间直连到已知的服务&#xff0c;设备提供的网络&#xff08;IP地址&#xff09;&#xff…

揭开机器学习转换器架构的神秘面纱

自2017年推出以来&#xff0c;转换器&#xff08;Transformers&#xff09;已成为机器学习领域的一支突出力量&#xff0c;彻底改变了专业翻译和自动完成服务的能力。 最近&#xff0c;随着OpenAI公司的ChatGPT和Meta公司的LLama等大型语言模型的出现&#xff0c;转换器的受欢…

保障线程安全性:构建可靠的多线程应用

目录 引言 为什么线程安全性如此重要&#xff1f; 1. 竞态条件&#xff08;Race Conditions&#xff09; 2. 死锁&#xff08;Deadlocks&#xff09; 3. 数据竞争&#xff08;Data Races&#xff09; 4. 内存可见性&#xff08;Memory Visibility&#xff09; 面临的挑战…

【网络安全技术】电子邮件安全PGP,SMIME

一、PGP&#xff08;Pretty Good Privacy&#xff09; PGP是一种邮件加密手段&#xff0c;他在发邮件一方加密&#xff0c;然后发给发送方邮件服务器&#xff0c;发送方邮件服务器再发送给接收方邮件服务器&#xff0c;然后接收方再从接收方邮件服务器pop出来&#xff0c;这整…

Axure动态面板的应用与ERP系统登录界面、主页左侧菜单栏、公告栏的绘制

目录 一、动态面板 1.1 简介 1.2 使用动态面板的原因 二、动态面板之轮播图实现案例 2.1 完成步骤 2.2 最终效果 三、动态面版之多方式登录案例 四、动态面板之后台主界面左侧菜单栏 五、ERP登录界面 六、ERP主界面菜单栏 七、ERP公告栏 八、登录页面跳转公告栏 一…

OpenAI开源超级对齐方法:用GPT-2,监督、微调GPT-4

12月15日&#xff0c;OpenAI在官网公布了最新研究论文和开源项目——如何用小模型监督大模型&#xff0c;实现更好的新型对齐方法。 目前&#xff0c;大模型的主流对齐方法是RLHF&#xff08;人类反馈强化学习&#xff09;。但随着大模型朝着多模态、AGI发展&#xff0c;神经元…

【专栏目录】

摘要 本专栏是讲解如何改进RT-DETR的专栏。改进方法采用了最新的论文提到的方法。改进的方法包括&#xff1a;增加注意力机制、更换卷积、更换block、更换backbone、更换head、更换优化器等&#xff1b;每篇文章提供了一种到N种改进方法。 评测用的数据集是我自己标注的数据集…

【设计模式--行为型--中介者模式】

设计模式--行为型--中介者模式 中介者模式定义结构案例实现优缺点使用场景 中介者模式 定义 又叫调停模式&#xff0c;定义一个中介角色来封装一系列对象之间的交互&#xff0c;使原有对象之间的耦合松散&#xff0c;且可以独立的改变它们之间的交互。 结构 抽象中介者角色…

【Vue】elementUI表格,导出Excel

系列文章 【Vue】vue增加导航标签 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/134965353 【Vue】Element开发笔记 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/133947977 【Vue】vue&#xff0c;在Windows IIS平台…

Linux系统编程(二):标准 I/O 库(下)

参考引用 UNIX 环境高级编程 (第3版)嵌入式Linux C应用编程-正点原子 1. 标准 I/O 库简介 标准 I/O 库是指&#xff1a;标准 C 库中用于文件 I/O 操作&#xff08;如&#xff1a;读、写文件等&#xff09;相关的一系列库函数的集合 标准 I/O 库函数相关的函数定义都在头文件 &…

压缩包文件暴力破解 -Server2005(解析)

任务五十一: 压缩包文件暴力破解 任务环境说明:Server2005 1. 通过本地PC中渗透测试平台Kali使用Nmap扫描目标靶机服务版本信息,将 Telnet 版本信息字符串 作为 Flag 提交; flag:Microsoft Windows XP telnetd 2. 通过本地PC中渗透测试平台Kali对服务器场景Windows进行渗透测…

工业交换机的组网方式有哪些?

工业交换机也称作工业以太网交换机&#xff0c;即应用于工业控制领域的以太网交换机设备&#xff0c;由于采用的网络标准&#xff0c;其开放性好、应用广泛以及价格低廉、使用的是透明而统一的TCP/IP协议&#xff0c;以太网已经成为工业控制领域的主要通信标准。 工业交换机的…