SpringMVC
2021-10-08 22:49:29 30 举报
AI智能生成
此思维导图包含了有关SpringMVC的注解,配置文件等必要东西
作者其他创作
大纲/内容
开发流程
导入依赖
<dependency><br><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.6.RELEASE</version><br></dependency><br>
配置核心控制器
局部参数:声明配置文件位置
<init-param><br><param-name>contextConfigLocation</param-name><param-value>classpath:mvc.xml</param-value></init-param><br>
后端控制器
配置文件
告知springmvc哪些包存在被注解的类
注册注解开发驱动
试图解析器
作用
1.捕获后端控制器的返回值="index"
2.解析:在返回的值前后拼接==>"/index.jsp"
前缀
<!--前缀--><br><property name="prefix" value=" /"></property><br>
后缀
<!--后缀--><br><property name=”suffix" value=" .jsp"></property><br>
跳转
请求转发
举例
@RequestMapping(" /forw" )<br>class ForwardController{<br>@RequestMapping(" /test1")<br>public String testForward(){<br>System . out . println("test forward1");<br>//转发跳转/views/users.jsp<br>// return "views/users" ;//和下一-行等价<br>return "forward:/views/users. jsp";<br>}<br>@RequestMapping(" /test2" )<br>public String testForward2(){<br>System . out. println("test forward2");<br>//转发到/forw/test1<br>//return”forward:test1";//相对路径(转发到本类中的test1)<br>//转发到/forw/test1<br>return "forward:/forw/test1"; //绝对路径<br>}<br>
重定向
举例
@RequestMapping(" /redir")<br>class RedirectController{<br>@RequestMapping(" /test1")<br>public String testRedirect1(){<br>System . out. println("test redirect1");<br>//重定向到/redir/test1<br>//return " redirect:test1"; //相对路径(转发到本类中的test1)<br>return " redirect:/redir/test1";//绝对路径<br>@RequestMapping(" /test2" )<br>public String testRedirect2(){<br>System . out . println("test redirect2");<br>//重定向到/views/users.jsp<br>return "redirect:/view/user .jsp";<br>
跳转细节
1.在增删改之后,为了防止请求重复提交,重定向跳转
2.在查询之后,可以做转发跳转
Json处理
导入依赖
Jackson spr ingMVC默认的Json解决方案选择是Jackson, 所以只需要导入jackson的jar,即可使用。<br>
<dependency><br><groupId>com. fasterxml. jackson . core</groupId><br><artifactId>j ackson-databind</artifactId><br><version>2.9.8</version><br></dependency><br>
使用@ResponseBody
@RequestMapping(" /test1")<br>@ResponseBody //将handler的返回值, 转换成json(jackson) ,并将json响应给客户端。<br>public User hel1o1(){<br>System . out. println("he1lo world");<br>User user = new<br>User();<br>return user ;<br>}<br>
// @ResponseBody还可以用在handler的返回值 上<br>@RequestMapping(" /test2" )<br>public @ResponseBody List<User> hello2(){<br>System . out. println("hello world");<br>List<User> users = Arrays. asList(new User(),new User());<br>return users ;<br>}<br>
//如果返回值已经是字符串,则不需要转json,直接将字符串响应给客户端<br>@RequestMapping(value= " /test3" , produces =“ text/html ;charset=utf-8") //produces 防止中文乱码<br>@ResponseBody<br>public String hello2(){<br>System . out. println("hello world");<br>return "你好";<br>}<br>
使用@RestController
Controller类上加了@RestController注解,等价于在类中的每个方法上都加了@ResponseBody<br>
@Controller<br>@RestController<br>public class JsonController{<br>@RequestMapping(" /test1")<br>public User hello1(){<br>System . out. println("hello world");<br>User user = new User();<br>return user ;<br>}<br>/ /@Re sponseBody还可以用在handler的返回值上<br>@RequestMapping(" /test2" )<br>public List<User> he1lo2(){<br>System. out . println("hello world");<br>List<User> users = Arrays. asList(new User(),new User());<br>return users;<br>
使用@RequestBody
1.定义handler
class User{<br>private Integer id;<br>private String name;<br>private Boolean gender ;<br>//set get<br>}<br>@RequestMapping(" /users")<br>public String addUser(@RequestBody User user){/ /@RequestBody将请求体中的j son数据转换为java对象<br>System. out. println("cap2");<br>System . out . println("Post user :"+user);<br>return "index" ;<br>}<br>
2.Ajax发送json
var xhr = new XMLHttpRequest();<br>xhr . open(“post"," $ {pageContext . request . contextPath}/users?"+new Date() . getTime());<br>xhr . setRequestHeader(" content- type" , "application/json");//设置请求头<br>xhr . send(' {"id" :1,"name" :" shine",“gender":"true"}');//传递json串<br>//ajax<br>var user = {id:1, name:"shine"};<br>$.ajax({<br>url:'${pageContext . request . contextPath}/json2/test4',<br>type:'post',<br>contentType:"application/json",//声明请求参数类型为json<br>data:JSON. stringify(user),//转换js对象成json<br>success :function(ret){<br>console.1og(ret);<br>});<br>
Jackson常用注解
日期格式化
@JsonFormat(pattern-="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")<br>
public class User{<br>private Integer id;<br>private String name;<br>@JsonFormat( pattern= "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8" )<br>private Date birth;<br>get/set<br>}<br>
属性名修改
@JsonProperty("new_ name")<br>
public class User{<br>@JsonProperty("new_ id") //不再使用原属性名,而是"new_ .id"<br>private Integer id;<br>private String name ;<br>get/set<br>}<br>输出的json: {"new_ id" :xx, "name":"xx"}<br>
属性忽略
@JsonIgnore
public class User{<br>private Integer id;<br>@JsonIgnore //生成j son时,忽略此属性<br>private String name;<br>get/set<br>}<br>输出json时: {"id" :xx}<br>
null和empty属性排除
Jackson默认会输出null值的属性,如果不需要,可以排除。<br>
@Jsonlnclude(JsonInclude.Include.NON_ NULL) /ull值属性不输出@JsonIncludel(value= Jsonlnclude.Include.NON EMPTY) // empty属性<br>不输出(空串,长度为0的集合,null值)<br>
public class User{<br>private Integer id;<br>@JsonInclude( JsonInclude . Include . NON NULL) // 若”name==null"忽略此属性<br>private String name;<br>@JsonInclude( value= JsonInclude . Include . NON_ EMPTY) // 若hobby长度 为0或==null忽略此属性<br>private List<String> hobby;<br>get/set<br>如果name=null,且hobby长度为0, 则输出json时: {"id" :xx}<br>
自定义序列化
@JsonSerialize(using = MySerializer.class) //使用MySerializer输出某属性<br>
public class User {<br>private Integer id; <br>private String name;<br>@JsonSerialize(using = MySerializer .class)<br>private Double salary = 10000 .126;//在输出此属性时,使用MySerializer输出<br>get/set<br>则输出json时: {"id" :xx, "name" :"xxX", "salary" :10000.13}<br>
public class MySerializer extends JsonSerializer<Double> {<br>// value即Double salary的值<br>@Override <br>public void serialize(Double value, JsonGenerator gen,SerializerProvider serializers) throws IOException {<br>//将Double salary的值 四舍五入<br>String number = BigDecimal . value0f (value) . setScale(2,BigDecimal . ROUND HALF UP) . toString();<br>//输出四舍五入后的值<br>gen. writeNumber (number);<br>
FastJson
导入依赖
<dependency><br><groupId>com. alibaba< /groupId><br><artifactId>fastjson< /artifactId><br><version>1 .2. 54</version><br></dependency><br>
安装FastJson
<MVc :annotation-dr iven><br><!-- 安装FastJson,转换器--><br><mVc :message - converters><br><bean class= “com. alibaba . fastj son . support . spring. FastJsonHttpMessageConverter"><br><!--声明转换类型:json --><br><property name=" supportedMediaTypes"><br><list><br><value>application/json< /value><br></list><br></property><br>< /bean><br>< /mvc :message- converters><br>< /mvc : annotation-dr iven><br>
使用
@ResponseBody @RequestBody @RestController使用方法不变<br>
常用注解
日期格式化
@JSONField(format*"yyy/MM/dd")<br>
属性名修改
@JSONField(name="birth")<br>
忽略属性
@JSONField(serialize = false)<br>
包含null值
@JSONField(serialzeFeatures = SerializerFeature.WriteMapNullValue)默认会忽略所有null值,有此注解会输出null<br>
@JSONField(serialzeFeatures = SerializerFeature.WriteNullStringAsEmpty) null的String输出为""<br>
自定义序列化
@JSONField(serializeUsing = MySerializer2.class)<br>
MVC架构
概念
Model
模型:即业务模型,负责完成业务中的数据通信处理,对应项目中的service和dao<br>
View
视图:渲染数据,生成页面。对应项目中的Jsp<br>
Controller
控制器:直接对接请求,控制MC流程,调度模型,选择视图。对应项目中的Servlet<br>
好处
1.MVC是现下软件开发中的最流行的代码结构形态
2.人们根据负责的不同逻辑,将项目中的代码分成MVC3个层次
3.层次内部职责单一,层次之间耦合度低
4.符合低耦合 高内聚的设计理念,也实际有利于项目而长期维护
接受请求参数
基本数据类型
请求参数和方法的形参同名即可
springmvc默认可以识别的日期字符串格式为:YYYY/MM/dd HH:mm:ss通过@DateTimeFormat可以修改默认日志格式
举例
// id<br>name gender<br>// http://localhost : 8989/xxx/ .. /test1?id=1&name=zzz&gender=false&birth-2018-12-12 12 :20 :30<br>@RequestMapping(" /test1")<br>public String testParam1 (Integer id,<br>String name,<br>Boolean gender,<br>@DateTimeFormat ( pattern="yyyy-MM-dd HH :mm:ss")Date birth) {<br>System. out. print1n("test param1");<br>return” index" ;<br>
实体收参
请求参数和实体的属性同名即可
举例
public class User {<br>private Integer id;<br>private String name ;<br>@DateTimeFormat(pattern='”yyy-MM-dd" )<br>private Date birth;<br>private Boolean gender ;<br>//set/get ...<br>}<br>//http://localhost :8989/ ... /test2?id=1&name=zzz&gender=false&birth=2018-12-12 12 :20:30<br>@RequestMapping(" /test2")<br>public String testParam2(User user){<br>System. out. println("test param2");<br>System . out. println("user:" +user);<br>return "index" ;<br>}<br>
数组收参
简单类型的数组
举例
<form><br>......<br><input type=" checkbox" name= ”hobby" value="fb" />足球<br><input type=" checkbox" name=" hobby" value="bb" />篮球<br><input type=" checkbox" name= ”hobby" value="vb" />排球<br></form><br>//http://localhost:8989/ .../test3?hobby=football&hobby=basketball<br>@RequestMapping(" /test3")<br>public String testParam3 (String[] hobby){<br>for(String h:hobby){<br>System. out. print(h+" ");<br>}<br>return " index" ;<br>}<br>
集合收参
举例
public class UserList {<br>//private User[] users;<br>private List<User> users;<br>//set/get. .<br>}<br>// <input type="text" name="users[0] .id"/><br>// post请求: http://...?users[0] . id=1&users[0] .name=zhangsan&users[0]. birth=2018-12-12&users[1] . id=2&.<br>@RequestMapping(" /test4")<br>public String testPar am4(UserList userList){<br>for(User user :userList . getUsers()){<br>System. out. println(user);<br>return "index" ;<br>}<br>
路径参数
举例
// {id} 定义名为id的路径; [/hello/{id}] 的匹配能力和[/hello/*] 等价<br>// http://localhost :8989/... /he1lo/10 {id}匹配到10<br>@RequestMapping(" /hello/{id}")<br>// @PathVariable将 {id }路径匹配到值赋给id参数<br>//路径名和参数名相同则@PathVariable(" id" )可简写为@PathVariable<br>public String testParam5(@PathVariable("id") Integer id){<br>System. out. print1n("id:"+id);<br>return " index" ;<br>}<br>// http://localhost :8989/.. /hello/tom <br>{username }匹配到tom<br>@RequestMapping(" /he1lo/ {username }")<br>public String testParam6 (@PathVariable("username") String name) {/ /将{username }路径匹配到的值赋给name参数<br>System. out . println("username:" +name);<br>return " index" ;<br>
中文乱码
1.页面中字符集统一
2.tomcat中字符集设置,对get请求中,对中文乱码参数有效
3.设置此filter,对中文乱码参数有效
举例
<!--此过滤器会进行: request. setCharactorEncoding("utf-8"); --><br><filter><br><filter-name> encoding< / filter-name><br><filter-class>org. springframework . web . filter .CharacterEncodingFilter</filter-class><br><init-param><br><par am-name> encoding</ par am-name><br><param-value>utf-8</ param-value><br></init-par am><br></filter><br><filter-mapping><br><filter-name>encoding</filter-name><br><url-pattern>/*</url-pattern><br></filter-mapping><br>
静态资源
静态资源问题
静态资源:html,js文件,css文件,图片文件
静态文件中没有urrl-pattern,所以默认访问不到,之所以可以访问,是因为,tomcat中有一个全局的servlet:org.apache.catalina.servlets.DefaultServlet,它的url-pattern是"/",是全局默认的Servlet,所以每个项目中不能匹配的静态资源的请求,有这个servlet来处理即可,但是,在springmvc中dispatcherservlet也采用了"/"作为url-parttern,则项目中不会再使用全局的Servlet,则静态资源不能完成访问
解决方案1
Dispathcer采用其他的url-pattern,此时,所有访问handler的路径都要以action结尾
<servlet><br><servlet-name>mvc9</servlet -name><br><servlet-class>org. spr ingf r amework . web. servlet . DispatcherServlet</servlet-class><br></servlet><br><servlet -mapping><br><servlet-name>mvc9< /servlet-name><br><url-pattern>* . action</url-pattern><br></servlet -mapping><br>
解决方案2
DispathcerServlet的url-pattern依然采用"/",但追加配置
< !--<br>额外的增加一个handler,且其requestMapping: " /**"可以匹配所有请求,但是优先级最低<br>所以如果其他所有的handler都匹配不上,请求会转向“ /**”, 恰好,这个handler就是处理静态资源的<br>处理方式:将请求转会到tomcat中名为default的Servlet<br><mvc :default-servlet-handler/><br>
解决方案3
. mapping是访问路径,location是静态资源存放的路径<br>
将/htm/** 中/**匹配到的内容,拼接到/hhh/后htp./...html/a.htmtl访问/hhh/a.html
拦截器
作用
抽取handler中的冗余功能
定义拦截器
执行顺序
preHandle--postHandle--afterCompletion<br>
举例
在handler之前执行:抽取handler中的冗余代码
@Override
public boolean preHandle (HttpServletRequest request ,
Ht tpServletResponse response, object handler) throws Exception {
System . out . println("pre~~~");
/*
response . sendRedirect(" /spr ingMVC. day2/index. jsp");//响应
return false;//中断请求
*/
return true;//放行, 后续的拦截器或handler就会执行
}
在handler之后执行:进一步的响应定制
@Override<br>public void postHandle(HttpServletRequest request ,<br>HttpServletResponse response, object handler ,<br>ModelAndView modelAndView) throws Exception{<br>System . out . println("post~~");<br>}<br>
在页面渲染完毕之后执行:资源回收
@Override<br>public void afterCompletion( HttpServletRequest request,<br>HttpServletResponse response, object handler, Exception ex)<br>throws Exception {<br>System . out. println("after~~");<br>}<br>
配置拦截路径
<mvc :interceptors><br><mvc :interceptor><br><mvc :mapping path=" /inter/test1"/><br><mvc :mapping path=" /inter/test2" /><br><mvc :mapping path=" /inter/test*"/> <!-- test开头--><br><mvc :mapping path=" /inter/**"/> <!-- /** 任意多级任意路径--><br><mvc :exclude-mapping path=" /inter/a/**"/> <!--不拦截此路径--><br><bean class=" com. baizhi . interceptor . MyInter1"></bean> < !--拦截器类--><br>< /mvc : interceptor> <br>< /mvc :interceptors><br>
0 条评论
下一页