SpringMvc入门学习(IDEA创建SpringMVC项目)
了解SpringMvc之前先看看Mvc的工作原理
1、MVC工作原理
M:Model(完成业务逻辑 Service/dao/entity/)
V:View(完成界面渲染 jsp/html)
C:Controller(控制器->类似于CPU 接受请求->调用M->返回V)
MVC工作原理图
2、SpringMvc工作原理
1.Spring和SpringMvc的关系:
SpringMVC是一个MVC的开源框架,SpringMVC是Spring的一个后续产品,其实就是Spring在原有基础上,又提供了web应用的MVC模块,可以简单的把SpringMVC理解为是spring的一个模块(类似AOP,IOC这样的模块),底层使用Servlet实现,主要处理客户的请求和做出响应。简化web开发。
2.SpringMVC中的组件:
前端控制器(DispatcherServlet):(不需要工程师开发),由框架提供(重要)
Spring MVC 的入口函数。接收请求,响应结果,相当于转发器,中央处理器。有了 DispatcherServlet 减少了其它组件之间的耦合度。用户请求到达前端控制器,它就相当于mvc模式中的c,DispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,DispatcherServlet的存在降低了组件之间的耦合性。
处理器映射器(HandlerMapping):根据请求的url查找Handler。HandlerMapping负责根据用户请求找到Handler即处理器(Controller),SpringMVC提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
处理器(Handler):(需要程序员去写代码处理逻辑的)controller
处理器适配器(HandlerAdapter):按照特定规则(HandlerAdapter要求的规则)去执行Handler 通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
视图解析器(ViewResovler):进行视图解析,多返回的字符串,进行处理,可以解析成对应的页面
视图View(需要工程师开发):View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf...)
注意:处理器Handler(也就是我们平常说的Controller控制器)以及视图层view都是需要我们自己手动开发的。其他的一些组件比如:前端控制器DispatcherServlet、处理器映射器HandlerMapping、处理器适配器HandlerAdapter等等都是框架提供给我们的,不需要自己手动开发。
3.SpringMvc工作原理图
SpringMvc工作流程
第一步:用户发起请求到前端控制器(DispatcherServlet)
第二步:前端控制器请求处理器映射器(HandlerMappering)去查找处理器(Handle):通过xml配置或者注解进行查找
第三步:找到以后处理器映射器(HandlerMappering)像前端控制器返回执行链(HandlerExecutionChain)
第四步:前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler),并处理相应的业务逻辑(也就是controller->service->dao)
第五步:处理器Handler执行完给处理器适配器返回ModelAndView对象
第六步:处理器适配器向前端控制器返回ModelAndView对象,Model 是返回的数据对象,View 是个逻辑上的 View
第七步:前端控制器请求视图解析器(ViewResolver)去进行视图解析,返最后回View对象
第八步:前端控制器对视图view进行渲染
第九步:最后前端控制器向用户响应结果
1.创建项目(springmvc实际上是web项目)
2.项目命名
3. 在WEB-INF目录下建classes和lib等目录
4,编写处理器
package com.wxz;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/*** TODO** @author wxz* @date 2022/2/18 20:29*/
@Controller
public class TestController {@RequestMapping("/testmvc.do")public String test() {return "index.jsp";}
}
5.编写springmvc配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!-- 开始相关注解配置 --><!-- 组件扫描 --><context:component-scan base-package="com.wxz"></context:component-scan><!-- 开启SpringMVC相关注解 --><mvc:annotation-driven></mvc:annotation-driven></beans>
6.编写web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!-- 配置springmvc的控制器 --><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><!-- 配置SpringMVC初始化文件 --><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><!-- 项目启动时就初始化DispatcherServlet --><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping><!-- 配置spring内置的编码过滤器 --><filter><filter-name>charset</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>charset</filter-name><servlet-name>springmvc</servlet-name></filter-mapping>
</web-app>
7.导入jiar包
8.打包
9.配置tomcat
10.放入tomcat中运行
11. 运行项目
12.页面访问
关于WEB-INF目录下面的jsp不能直接被访问问题
WEB-INF目录下的jsp文件,在浏览器中是不能直接访问的。(没有访问的权限,禁止访问) 如果将jsp文件放入WEB-INF目录下,将不能访问。
在java web项目部署到服务器的以后,项目的目录结构是WebContent下的所有文件夹。如果将jsp/html页面放到WEB-INF目录外面,可以直接请求这个页面。但是多数情况下我们会将页面放到WEB-INF目录下。
页面放在WEB-INF目录下,这样可以限制访问提高安全性。web-inf目录下的文件只能通过请求转发来访问,不能通过页面重定向访问。
WEB-INF目录下面是静态资源,不能直接被访问
index.jsp list.jsp都是可以访问的
怎么才能正常的访问WEB-INF下面的jsp呢??
第一种方式??
第二种方式:
获取页面的数据,获取客户端的数据
<%--User: Date: 2022/2/19Time: 17:16To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head><title>Title</title>
</head>
<body>
<!-- 普通文本数据 -->
<form action="hello/word.do" method="post"><p>用户名:<input type="text" name="userName" /></p><p>年龄:<input type="text" name="age" /></p><p>性别:<input type="radio" name="sex" value="男" />男<input type="radio" name="sex" value="女" />女</p><p>爱好:<input type="checkbox" name="like" value="篮球" />篮球<input type="checkbox" name="like" value="足球" />足球</p><p>城市:<select name="city"><option value="wh" >武汉</option><option value="sh" >上海</option></select></p><input type="submit" value="提交" />
</form>
</body>
</html>
无法获取到数组的值,要想获取到数组的值,只需要加注解@RequestParam
使用map接收参数
使用java对象接受参数
//使用简单java对象接收请求参数@RequestMapping("/word3.do")public void getParam4(User user) {System.out.println(user);}
视图解析器配置
<!-- 配置视图解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- 配置视图的前缀 --><property name="prefix" value="/WEB-INF/jsp/"></property><!-- 配置视图的后缀 --><!-- <property name="suffix" value=".jsp"></property> --></bean>
springmvc返回json数据
在springmvc中,所有的controller在返回的数据中,若是字符串,则默认当做视图的名称。springmvc会根据这个名称,查找视图,然后进行解析,返回给客户端。没有办法直接返回json字符串。
在springmvc中,使用@ResponseBody,标识返回的结果是一个json字符串。
使用Springmvc中支持默认自动转换
在springmvc中,springmvc默认是支持自动将对象转化为JSON字符串。且编码格式UTF-8.
但是springmvc默认支持json转化类,使用的jackson。需要主动的导入jackson的相关jar包。
1.导入jackson相关jar包
jackson-annotations-2.9.9.jar
jackson-core-2.9.9.jar
jackson-databind-2.9.9.jar
2.相关代码
@RequestMapping(value ="list.do")@ResponseBodypublic Object list2(Model model,HttpServletResponse resp,HttpServletRequest req) throws IOException {String contentType = req.getContentType();System.out.println(contentType);List<User> users = userService.selectList();//将数据转化为JSON字符串//String jsonString = JSONObject.toJSONString(users);//将字符串返回return users;}
文件上传
springmvc简化文件上传的工作,只需要导入相关的jar包,配置处理器,使用参数接收上传的文件即可。
1.导入相关jar包
commons-fileupload-1.3.1.jar
commons-io-2.4.jar
2.配置文件上传的处理器
<!-- 配置文件上传 解析器--><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
3.使用参数接收上传文件
//注意:接收上传的文件 一定要使用 MultipartFile 类型接收,当多个同名的文件时,使用数组接收
//当表单名称和方法中形式参数名不一致时,可以使用@RequestParam
@RequestMapping("upload.do")public void upload(MultipartFile[] file,String text) throws IllegalStateException, IOException {System.out.println(file); for (MultipartFile multipartFile : file) {System.out.println("form表单提交的名称"+multipartFile.getName());System.out.println("请求数据的类型:"+multipartFile.getContentType());System.out.println("文件名称:"+multipartFile.getOriginalFilename());System.out.println("文件的大小"+multipartFile.getSize());//将文件保存在物理磁盘上//file.transferTo(new File("E:\\test.jpg"));}System.out.println(text); }
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="upload.do" method="post" enctype="multipart/form-data">文件:<input type="file" name="file"/><br><input type="submit" value="提交" />
</form>
</body>
</html>
springmvc中拦截器
在springmvc,为了更好控制处理器,spring提供了拦截器,用于介入控制器的执行。
只需要定义实现HandlerInterceptor接口,配置拦截地址即可。
1.实现HandlerInterceptor接口
package com.wxz.interceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;public class MyInterceptor implements HandlerInterceptor {/*** 拦截器中第一个执行的方法 : 返回值为true时 放行 为 false 则拦截* request : HTTP请求对象* response : HTTP响应对象* handler : 待执行的方法*/public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {System.out.println("handler:"+handler);System.out.println("======preHandle=========");return true;}/*** postHandle 在具体的handler执行完成后执行* 在具体的handle执行完成后 但是 视图解析完成前*/public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {modelAndView.addObject("key", "我是在拦截器中放入的参数");System.out.println("============postHandle==========");}/*** afterCompletion 在具体的handler执行完成后执行* 视图解析后*/public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {System.out.println("===========afterCompletion============");}}
2.配置拦截器
<mvc:interceptors><mvc:interceptor><!-- 拦截地址 --><!-- 拦截所有的路径 --><mvc:mapping path="/**"/><!-- 排除地址 --><mvc:exclude-mapping path="/test2.do"/><!-- 具体的拦截器 --><bean id="myInterceptor" class="com.wxz.interceptor.MyInterceptor" /></mvc:interceptor>
</mvc:interceptors>
注意:
springmvc的拦截器,主要拦截Handler,由于拦截器是在DispatchServlet中执行,所以若你的url地址,根据不走DispatchServlet,那么拦截器将不会拦截。
在web项目中,一定存在filter但是未必存在HandlerInterceptor,而Filter的拦截是针对所有的请求,但是Interceptor针对的具体的Handler。
SpringMvc入门学习(IDEA创建SpringMVC项目)相关推荐
- webpack入门学习笔记10 —— 在项目中使用图片资源
1. 写在前面 在前端项目中,图片是必不可少的一种资源.在使用图片的时候,我们可以有以下几种方式: 在 .html 文件中,通过 <img src="" alt=" ...
- SpringMVC学习-IDEA创建maven项目添加webapp怎么配置
当你创建Spring项目时,选择的是maven,但是需要自己创建webapp,该怎么解决? 1.创建一个普通webapp文件夹 2.对其进行比较标记,标记为web 3.记得更改路径,改成我们项目下we ...
- myeclipse需要配置服务器得项目是,【SpringMVC】使用Myeclipse创建SpringMVC项目【超详细教程】...
之前一直是使用Eclipse创建Web项目,用IDEA和MyEclipse的创建SpringMVC项目的时候时不时会遇到一些问题,这里把这个过程记录一下,希望能帮助到那些有需要的朋友.我是用的是MyE ...
- java帮助文档mye_【SpringMVC】使用Myeclipse创建SpringMVC项目【超详细教程】
之前一直是使用Eclipse创建Web项目,用IDEA和MyEclipse的创建SpringMVC项目的时候时不时会遇到一些问题,这里把这个过程记录一下,希望能帮助到那些有需要的朋友.我是用的是MyE ...
- Spring入门(一):创建Spring项目
本篇博客作为Spring入门系列的第一篇博客,不会讲解什么是Spring以及Spring的发展史这些太理论的东西,主要讲解下如何使用IntelliJ IDEA创建Spring项目以及通过一个示例了解下 ...
- lua语言入门学习(四)项目初体验之抽奖转盘(1)
lua语言入门学习 今天前辈教我看了项目,感觉果然公司级的项目分工都比较严谨,很多东西都是略懂功能,但对于底层逻辑的实现并不清楚. 为了保护公司这个游戏具体实现功能上本身的隐私,日常代码分享中不会分享 ...
- 安卓入门系列-02创建一个项目
利用Android Studio创建一个项目 说明 Android Studio 是项目式开发,和eclipse有所不同,需要习惯. 创建项目 点击第一行,创建一个新项目. 在1处填入项目名称,2处填 ...
- lua语言入门学习(八)项目初体验之玩家事件(2)
lua语言入门学习 今天是实习的第二周,前辈给我的任务是熟悉playerevent中每个函数的基本功能. 文章目录 lua语言入门学习 前言 一.代码 1.代码功能自己简析 1.代码功能自己简析 2. ...
- 学习SpringMVC笔记——Intellij IDEA创建SpringMVC项目
选择Spring→勾选SpringMVC→选择Download(让IDEA帮我们下载需要的jar包,可能会有点慢) 生成的一个项目(左),把lib文件夹移动到WEB-INF文件夹下(右) 配置文 ...
最新文章
- WPF入门(三)-几何图形之不规则图形(PathGeometry) (2)
- 关于模态对话框和非模态对话框的创建、显示,以及和父对话框的传值
- springmvc @responsebody json字符编码
- 翻译:MariaDB DATABASE()
- python 爬虫 ~ 查看收发包的情况
- python读取只读word只读_Python用于NLP :处理文本和PDF文件
- PHP秒杀截流原理,流量新大陆:巧借PC、移动端评论截流,让精准流量“爆起来”...
- python 接口 、继承、重载运算符
- 经典:编程面试的 10 大算法概念汇总
- Mendix入局中国低代码,开发者们你准备好了吗
- 原创内容的17PK飞鸽传书
- Ajax学习总结(2)——Ajax参数详解及使用场景介绍
- CMap的使用(转)
- 根据生日计算年龄 java_Java 根据出生日期获得年龄
- 51CTO网友感谢信:昨天以940分的成绩顺利通过NE考试 在此特地感谢网工泡泡
- Atitit 动态调用webservice与客户端代理方式调用
- matlab聚类分析_数据挖掘——聚类分析
- 1991-2019年中国科技统计年鉴(EXCEL版)
- 计算机网络应用层和传输层及网络层协议有哪些
- APT、ET、RGI、ICQ