SpringMVC开发流程
1.jar包
spring-aop.jar
spring-bean.jar
spring-context.jar
spring-core.jar
spring-web.jar
spring-webmvc.jar
2.创建项目:Dynamic Web Project
第一个SpringMVC程序
Servet------Springmvc
jsp--->Servlet-->Jsp
springmvc配置文件和spring的配置文件一样,名字:springmvc.xml
选中常用的命名空间:beans, aop,context,mvc
普通的servlet流程:
请求---->url--->pattern---->交给对应的servlet处理
3.如果现在想用springmvc,而不是普通的servlet.如何告知程序?如何让springmvc介入程序,则需要配置一个springmvc的jar里面自带的servlet,这个servlet叫:DispatcherServlet.class
4.配置springmvc自带的servlet,同时也是通过一下配置拦截所有请求,交给servlet处理,也是mvc的入口,下面这个图片是配置servlet
其中:<url-pattern>/</url-pattern>
/:表示一切请求,注意不是/*
/user:拦截以user开头的请求
/user/abc.do:只拦截该请求
<url-pattern>.action</url-pattern>:表示是只能拦截.action结尾的请求
5.配置springmvc的配置文件 显示指定springmvc的配置文件
下面是默认方式,只要放在指定的目录,使用指定的文件名即可:/WEB-INF/springDispatcherservlet-servlet.xm
注意:包的命名org.xxx.servlet
org.xxx.controller
org.xxx.handler
org.xxx.action
这三个包都是控制器的命名,根据个人习惯而已
6.做一个简单的前后端交虎的:
html前端:
controller拦截:
前端为:下面的是多层映射
controller为:主要是注解要和前端html里面的映射一致,可以和类名不一致
映射是去匹配@RequestMapping注解,可以和类名和方法不一样.页面使用的是请求转发的方式,不是重定向
7.配置扫描器
8.配置视图解析器
下面是视图解析器在流程中的作用
注意:NoClassFoundError:如果报这样的 错误,表示缺少jar包
9.REST风格:软件编程风格
Springmvc:
GET:查
POST:增加
DELETE:删除
PUT:改
普通浏览器只支持get post发方式,其它请求方式;其他请求方式如delete|put请求是通过过滤器新加入的支持
springmvc实现:put/post请求方式的步骤:
1>通过增加过滤器支持
2>表单的前端是通过隐藏域实现的
注意:
1>必须是post
2>通过隐藏域的 value值,设置实际的请求方式DELETE|PUT
3.java类的控制器
通过method=RequestMethod.DELETE 匹配具体的请求方式
此外,可以发现,当映射名相同@RequestMapping(value="testRest"),可以通过method指定不同的请求.
过滤器中处理put|delete请求的部分源码:
原始请求:request,该请求默认只支持get,post,header,但是,如果是"POST"并且有隐藏域
<input type="hidden" name="_method" value="DELETE">
则,该过滤器将原始的request加入新的请求方式DELETE,并将原始请求转为requesttToUse请求(request+Delete,也就是变成了2个请求),最后将requestToUse放入请求链中,
后续再使用request时,实际就使用改造后的requestToUse
这个注解是接收从前端接收到的表单数据:@RequestParam("uname") String name,@RequestParam(value="uage",required=false,defaultValue="23")
@RequestParm("uname"):接受前端传递的值,等价于request.getParameter("uname")
required=false:该属性不是必须的
defaultValue="23":默认值23
获取请求信息:@RequestHeader()
public String testRequestHeader(@RequestHeader("Accept-Language") String a1)
通过@RequestHeader("Accept-Language") String a1获取请求头中的Accept-Language值,并将值保存在a1变量中
cookie --------session
存在客户端 存在服务器端
通过mvc获取cookie值(JESSIONID)
@CookieValue
(前置知识:服务端在接受客户端第一次请求时,会给客户端分配一个session(该session包含一个sessionID)),并且服务端在第一次响应客户端时,并将该sessionID赋值给JSESSIONID并传递给客户端
小结:
SpringMVC处理各种参数的流程/逻辑
1.前端发请求a--->@RequestMappting("")
每个请求---------方法
2.处理请求中的参数
@RequestMappting("a")
public String aa(@Xxxx注解("xyz") xyz){
}
使用对象(实体类对象Student)接受请求参数
在SpringMVC中使用原生态的Servlet API:HttpServletRequest;直接将servlet-api中的类,接口等,写在mvc中方法中的座位参数即可,然后就可以使用了
@RequestMapping(value="testServletAPI")
public String testServletAPI(HttpServletRequest request,HttpServletResponse repons){
request.getParameter("uname");
System.out.println(request);
return "success";
}
处理模型数据:
如果跳转时需要带数据:V,M则可以使用以下方式:
ModelAndView,ModelMap,Map --数据放在request作用域
@SessionAttribute,@Mode7lAttribute
方式一:ModelAndView
前端success.jsp通过EL表达去取数据,在requestScope对象里面去取
ModelMap,Map 这两种传递数据的方法是:
示例:
public String testModel(Model model|Map<String Object> m){
m.put(x,"...")就会将x对象放入request域中
}
如何将上述数据放入session中?只需要增加一个@SessionAttributes()注解即可,这个注解要加在类的上面
通过类型来放入session作用域
@ModelAttribute经常在更新时使用
如果ModelAttribute的map的key后后面的@RequestMapping的参数类型不一致,可以通过注解进行对应
@ModelAttribute经常在更新时使用,在不改变原有代码功能的基础上增加新功能,均被执行一次,因此使用时需要注意
通过@ModelAttribute修饰的方法,会在每次请求前先执行,并且该方法的参数map.put()方法将对象放入下次查询的参数中
必须满足的约定:
map.put(k,v)期中的k必须是即将查询的方法参数的首字母小写
testModelAttribute(@ModelAttribute("stu")Student student){
},即student;如果不一致,需要通过@
2.视图,视图解析器
视图的顶级接口:view
视图解析器:ViewResolver
常见的视图解析器:
InternalResourceView,
InternalResourceViewResolver
public class JstlView extends InternalResourceView:springMVC解析jsp时,会默认使用InternalResourceView,如果发信jsp中包含了jstl语言,则自动转换JstlView
国际化:针对不同地区,不同国家,进行不同的显示
JstView 可以解析为可以解析jstl\实现国际化操作
具体实现国际化步骤:
1>创建资源文件
基名_语言_地区.properties
基名_语言.properties
i18n/base
2>配置springmvc.xml,加载资源文件
<!---加载国际化资源文件->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundMessageSource"> 这个id必须是messageSource,写死的,这个springmvc规定的
<property name="basename" value="i18n"></property>
ResourceBundMessageSoure会在springmvc响应程序时介入(解析国际化资源文件)
3>使用
通过jstl使用国际化
jstl.jar
standwd.jar
在页面里面引进jstl
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<fmt:message key="resource.welcome"></fmt:message>
<fmt:message key="resource.exist"></fmt:message>
InternalResourceViewResolver其他功能:
1. index.jsp----->Controller(@RequestMapping)------->success.jsp
要用SpringMVC实现: index.jsp----->success.jsp
<mvc:view-Controller path="handler/welcome" view-name="success"/>
以上注解,会让所有的请求转入<mvc:..>中匹配映射地址,而会忽略调用@RequestMapping();
如果想让@RequestMapping("a")和<mvc:..>共存,则需要加入一个注解,则需要再springmvc的配置文件增加<mvc:annotation-driven></mvc:annotation-driven>
2.指定跳转方式:return "forwar:/views/success.jsp":
forward: redirect需要注意,此种方式不会被视图解析器加上前缀和后缀
3.处理静态资源:html css js 图片 视频
可以与用户交互,因为时间/地点的不同而结果不同的内容:动态(百度:天气)
在springMVC中,如果直接访问静态资源:直接404错误.
原因:之前将所有的请求通过通配符"/"拦截了,进而交给SpringMVC的入口DispatcherServlet去处理:找该请求对应的映射的@RequestMapping()
解决:如果是需要mvc处理的,则交给@requestMapping("img.png")处理:如果不需要springmvc处理的,交给tomcat服务器默认的servlet进行处理;如果有对应的请求拦截,则交给相应的Servlet去处理,如果没有对应的servlet,那么直接访问
tomcat默认的Servlet在哪里?在tomcat配置文件\conf\web.xml中
例如:abc
<servlet>
<servlet-name>abc</servlet-name>
<servlet-class>xxx.xxx.xx.ABCServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>abc</servlet-name>
<url-pattern>/abc</url-pattern>
</servlet-mapping>
解决静态资源方案:如果有springmvc对应的@RequestMapping则交给spring处理;如果没有对应的@requestMapping,则交给服务器tomcat默认的servlet去处理
实现方法:只需要增加一个配置即可,在springmvc.xml:
<!--该注解会让springmvc:接收一个请求,并且该请求没有对应的@RequestMapping,那么tomcat就会让默认的servlet进行处理,直接访问-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
<mvc:annotation-driven></mvc:annotation-driven>
总结:要让springmvc访问静态资源,只需要加入以上2个注解
4.类型转换
1>Spring自带一些常见的类型转换器
public Sring testDelete(@PathVariable("id") String id),即可以接受int类型数据id,也可以接受String类型的id,自带类型转换器
2>也可以自定义类型转换器
a>编写自定义类型转换器的类(需要实现Converter接口)
b>配置:
将MyConverter加入到springmvc中
步骤1:将自定义转换器纳入springIOC容器
<bean id="myConverter" class="org.lanqiao.comverter.MyConverter"></bean>
步骤2:将myConverter再纳入SpringMVC提供的转换器Bean
<bean class=""org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="myConverter"/>
<set>
</property>
</bean>
步骤3;将conversionServer注册到annotation-driven中
4.测试转换器
期中@RequestParam(""studentInfo")是触发转换的桥梁:
@RequestParam("studentInfo")的数据是前段传递过来的:2-zs-33,但是需要将该数据复制给修饰的目的对象Student;因此SpringMVC可以发现接收到数据和目标数据不一致,并且
这两种数据分别是String,Student,正好符合public Student convert(String source)
5.数据格式化
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss")
SprinfMVC提供了很多注解,方便我们数据格式化
实现步骤:
1.在springmvc.xml配置数据格式化所依赖的bean
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"></bean>
2.通过注解使用
@DateTimeFormat(pattern="yyyy-MM-dd")
@NumberFormat(parttern="###,#") //123,4
JSTL有2个jar:
1.jstl-1.2.jar
2.standard-1.1.2.jar
在jsp页面里面导入jstl库
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c">
1.错误消息:
public String testDateTimeFormat(Student student,BindingResult result,Map<String,Object> map)
需要验证的数据是Student中的birthday,SpringMVC要求,如果校验失败,则将错误信息自动放入该对象之后紧挨着的BindingResult中
即Student student,BindingResult result之间不能有其它参数
如果要将控制台的错误消息传到jsp中显示,则可以将错误消息对象放入request域中,然后在jsp中从requestScope中获取
2.数据校验
JSR303提供的标注注解:
HIbernate Validator是对JSR303的扩展
@Null 被注释的元素必须为null
@NotNull 被注释的元素必须补位null
@AssertTrue 被注释的元素必须为True
@AssertFalse 被注释的元素必须为false
@Min(value)被注释的元素必须是一个数字,其值必须大于或等于value
@Max(value)被注释的元素必须是一个数字,其值必须小于或等于value
@DeximalMin(value) 被注释的元素必须是一个数字,其值必须小于或等于value
@DecimalMax(value)被注释的元素必须是一个数字,其值必须小于或等于value
@Size(max,min)被注释的元素的取值范围必须是介于min和max之间
@Digits(integer,fraction)被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
Hibernate Validator 是JSR303的扩展,Hibernaet Validator提供了JSR303中所有内置的注解,以及自身扩展的4个注解:
@Email被注解的元素值必须是合法的电子邮箱地址
@Length 被注释的字符串的长度必须在指定的范围内
@NotEmpty被注释的字符串必须非空
使用Hibernate Validator步骤:
1.jar包
hiberante-validator.jar
classmate.jar
jboss-logging.jar
validatetion-api.jar
hibernate-validator-annotation-processor.jar
2.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理