springMVC学习总结

如何解决跨域问题
SpringBoot09 自定义servlet、注册自定义的servlet、过滤器、监听器、拦截器、切面、webmvcconfigureradapter过时问题
springmvc学习
springboot中文社区
springMVC的web.xml配置详解
javaweb运作原理(web.xml是核心)
SpringMVC第四篇——处理器映射器,处理器适配器,视图解析器的配置
js时间戳与日期格式的相互转换

配置文件加载的先后顺序

①<context-param,>

  • 该元素包含web应用servlet上下文初始化参数的声明。

  • listener、filter等在初始化时可以使用这些上下文信息。在servlet中可以通过getServletContext().getInitParameter(“context/param”)方法获取参数的值

②<listener,>,

  • 该元素用来注册一个监听器类。事件监听程序在①应用的启动和关闭;②session的创建与销毁,属性的新增、移除和更改;③对象被绑定到session中或从session中删除;时得到通知。

③<filter,>,定义一个filter类及它的初始化属性。在这里插入图片描述

④<servlet,>.声明一个Servlet数据。

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GgrKoVfw-1575037241465)(10.png)]

其他标签说明

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OrFGn5DD-1575037241466)(12.png)]

获取项目根路径
${pageContext.request.contextPath }

无框架时代

一个Servlet对应于一个功能,因此 如果有增删该查(查询单个、查询全部)5个功能,则需要创建5个servlet

jsp知识回顾

JSP九大内置对象(自带的,不需要new 也能使用的对象)

out:输出对象,向客户端输出内容(PrintWriter)PrintWriter out = response.getWriter();
request:请求对象;存储“客户端向服务端发送的请求信息”
request对象的常见方法:

String getParameter(String name); //根据请求的字段名key (input标签的name属性值) ,返回字段值value (input标签的value属性值)
String[] getParameterValues(String name); //根据请求的字段名key ,返回多个字段值value  (checkbox)
void setCharacterEncoding("编码格式utf-8"); //设置post方式的请求编码  (tomcat7以前默认iso-8859-1,tomcat8以后改为了utf-8)
getRequestDispatcher("b.jsp").forward(request,response);  //请求转发 的方式跳转页面   A - > B
ServletContext getServerContext(); //获取项目的ServletContext对象

servlet设置请求编码

request.setCharacterEncoding("utf-8");

servlet设置响应编码

response.setContentType("text/html; charset=UTF-8");
response.setCharacterEncoding("utf-8");

请求转发

request.getRequestDispatcher("目标页").forward(request, response);

重定向

response.sendRedirect("目标页");

常见状态码:

200:一切正常
300/301: 页面重定向 (跳转)
404:资源不存在
403:权限不足 (如果访问a目录,但是a目录设置 不可见)
500:服务器内部错误(代码有误)
其他编码:积累

四种范围对象(小->大)

pageContext JSP页面容器 (page对象); 当前页面有效
request 请求对象 同一次请求有效
session 会话对象 同一次会话有效
appliation 全局对象 全局有效(整个项目有效)

设计模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iaJsaAsQ-1575037241467)(mvc理解.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C81DhYo3-1575037241469)(三层.png)]

原理

url找到对应controler的原理(servlet可以做controller的原因)

web.xml写的是为了匹配到springMVC里扫描的controller组件的位置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OxVgNurw-1575037241470)(7.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1UD37YtG-1575037241470)(8.png)]

servlet请求和响应的过程:https://www.cnblogs.com/tk55/p/7440795.html

Servlet生命周期:5个阶段
加载
初始化: init() ,该方法会在 Servlet被加载并实例化的以后 执行
服务 :service() ->doGet() doPost
销毁 :destroy(), Servlet被系统回收时执行
卸载

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-40vymjmi-1575037241471)(Servlet生命周期.png)]

servlet的请求例子

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fRq7Hxot-1575037241473)(请求.png)]

servlet的响应例子

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1ykEyGuZ-1575037241473)(响应.png)]

请求转发和重定向

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zQjzql9V-1575037241474)(请求次数问题与数据丢失.png)]

配置注解驱动的原因

1:使用注解方式进行SpringMVC进行开发的时候,不配处理器映射器和处理器适配器,框架会默认加载DefaultAnnotationHandlerMapping,AnnotationMethodHandlerAdapter。
2:从spring3.1之后这两个类就过期了,但是还能使用。我们开发时候使用新的类。需要在配置文件中进行配置。我们使用注解驱动:

<mvc:annotation-driven/>
<!--这个配置是替代了配置:-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> 
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> 

SpringMvc执行流程

1.Spring MVC将所有请求都交由DispatchServlet进行处理。

2.DispatchServlet获取HandlerMapping(处理映射器),然后找到对应的HandlerBean处理Controller请求,并返回一个ModelAndView对象。

3.DispatchServlet查询一个或多个ViewResolver视图解析器对象, 并把视图渲染返回给前端。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qaX3hsNP-1575037241475)(1.png)]

SpringMVC中在加载完前置控制器(DispatchServlet)之后,会默认的加处理器映射器和处理器适配器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O9F0hyyi-1575037241476)(处理器映射器.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eAJEiBWj-1575037241477)(处理器适配器.png)]

1) 浏览器提交请求到中央调度器
2) 中央调度器直接将请求转给处理器映射器
3) 处理映射器会根据请求,找到处理该请求的处理器,并将其封装为处理器执行链后返回给中央调度器。
4) 中央调度器根据处理器执行链中的处理器,找到能够执行该处理器的处理适配器。
5) 处理器适配器调用执行处理器
6) 处理器将处理结果及要跳转的视图封装到一个对象 ModelAndView 中,并将其返回给处理器适配器。
7) 处理器适配器直接将结果返回给中央调度器。
8) 中央调度器调用视图解析器,将 ModelAndView 中的视图名称封装为视图对象。
9) 视图解析器将封装了的视图对象返回给中央调度器。
10) 中央调度器调用视图对象,让其自已进行渲染,即进行数据填充,形成响应对象。
11) 中央调度器响应浏览器。

DispatcherServlet中央调度器,在 MVC 架构模式中充当控制器 C,DispathcerServlet 是整个流程的控制中心,由它调度诸如处理器映射器处理器适配器视图解析器等其它组件处理用户请求,降低了组件之间的耦合

异常处理

常用的 SpringMVC 异常处理方式主要有三种:

  • 系统用系统定义好的异常处理器 SimpleMappingExceptionResolver
  • 使用自定义异常处理器
  • 使用异常处理注解

数据校验

在 Web 应用程序中,为了防止客户端传来的数据引发程序的异常,常常需要对数据进行验证。输入验证分为客户端验证与服务器验证。客户端验证主要通过 JS 脚本进行,而服务器端验证则主要是通过 Java 代码进行验证。

Hibernate数据校验注解

Bean Validation 中内置的 constraint

@Null 被注释的元素必须为 null

@NotNull 被注释的元素必须不为 null

@AssertTrue 被注释的元素必须为 true

@AssertFalse 被注释的元素必须为 false

@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值

@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值

@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值

@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值

@Size(max=, min=) 被注释的元素的大小必须在指定的范围内

@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内

@Past 被注释的元素必须是一个过去的日期

@Future 被注释的元素必须是一个将来的日期

@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式

Hibernate Validator 附加的 constraint

@NotBlank(message =) 验证字符串非null,且长度必须大于0

@Email 被注释的元素必须是电子邮箱地址

@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内

@NotEmpty 被注释的字符串的必须非空

@Range(min=,max=,message=) 被注释的元素必须在合适的范围内

404解决方案

是一个数字,其值必须在可接受的范围内

@Past 被注释的元素必须是一个过去的日期

@Future 被注释的元素必须是一个将来的日期

@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式

Hibernate Validator 附加的 constraint

@NotBlank(message =) 验证字符串非null,且长度必须大于0

@Email 被注释的元素必须是电子邮箱地址

@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内

@NotEmpty 被注释的字符串的必须非空

@Range(min=,max=,message=) 被注释的元素必须在合适的范围内

404解决方案

https://www.cnblogs.com/dssjustdoit/articles/9390395.html

Model , ModelMap , ModelAndView区别

ModelView

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-370Heoep-1575037241478)(5.png)]ModelAndView的setViewName:可用请求转发和重定向

Model和ModelMap

ModelMap是Model接口的实现类
SpringMVC中model有3种形式①Model②Map③ModelAndView不管用那种最终都会解析成ModelAndView

Spring、SpringMVC 中常用注解含义及用法

Spring MVC各种提交形式以及参数接收(form表单提交以及Json提交)
spring mvc 拓展 – controller 方法不加注解自动接收json参数或者from表单参数
三种常见的http content-type
application/x-www-form-urlencoded 浏览器表单提交
multipart/form-data 此种方式多用于文件上传
application/json 用来告诉服务端消息主体是序列化的json字符串

@RestController注解相当于@ResponseBody + @Controller合在一起的作用。
java之@Controller和@RestController以及@GetMapping和@PostMapping接收参数的格式使用](https://my.oschina.net/botkenni/blog/3105872)

1、@Controller:

在 SpringMVC 中只需要使用这个标记一个类是 Controller,然后使用@RequestMapping 和
@RequestParam 等一些注解用以定义 URL 请求和 Controller 方法之间的映射,这样的
Controller 就能被外界访问到。此外,Controller 不会直接依赖于 HttpServletRequest 和
HttpServletResponse 等 HttpServlet 对象,他们可以通过 Controller 的方法参数灵活的获取
到。

2、@RequestMapping:

使用 @RequestMapping 来映射 Request 请求与处理器,通过这个注解可以定义不同的处理器映射规则,即为控制器指定可以处理哪些 URL 请求。用@RequestMapping 来映射 URL 到控制器类,或者是到 Controller 控制器的处理方法上。
注意:method 不写的话,默认GET、POST都支持,根据前端方式自动适应
@RequestMapping参数详解:https://my.oschina.net/liting/blog/525064

3、@RequestBody:

这个是介绍前后端数据发送与接收问题的
https://blog.csdn.net/zzti_erlie/article/details/90294597

用于读取 http 请求的内容(字符串),通过 springMVC 提供的 HttpMessageConverter 接口
将读取到的内容转换为 json、xml 等格式的数据,再转换为 java 对象绑定到 Controller 类方法的参数上。
简单点来说,就是把 json 格式的数据转换为 java 对象,就举个例子来说明:
编写一个 jsp 页面来向后台传递 json 格式的数据(切记是 json 格式的):

Json对象和Json字符串的区别

js中 给json对象添加新的属性

【@RequestBody接收的是一个Json对象的字符串,然而在ajax请求往往传的都是Json对象,那么如何传输Json对象的字符串呢?
1·用 JSON.stringify(data)的方式就能将对象变成字符串。
2·同时ajax请求的时候也要指定
dataType: “json”,//告诉服务器,我要想什么类型的数据(对后端返回的设置)
contentType:“application/json” //发送信息至服务器时内容编码类型,简单说告诉服务器我传的是什么类型的数据(对前端所提交数据的设置)
这样就可以轻易的将一个对象或者List传到Java后端,使用@RequestBody即可绑定到对象或者对象的List.】

<script>
jsonData();
function jsonData()
{
$.ajax({
url:"<%=path%>/user/jsonTest.do",
dataType: "json",//告诉服务器,我要想什么类型的数据
contentType:'application/json;charset=utf-8',//发送信息至服务器时内容编码类型,简单说告诉服务器请求类型的数据
data:'{"username":"张三","address":"福州"}',//这样写也是json对象的字符串【data是要传输到后台的数据】
type:'post',
success:function(_data){//_data是后端传来的json格式的数据
alert(_data);//后端可用@ResponseBody传来json字符串
},error:function(error){
alert(error);
}
})
}
</script>

然后在后台接收一下:

@RequestMapping("/jsonTest.do")
public void jsonTest(@RequestBody User user) throws Exception
{
System.out.println(user.toString());
}

等同于如下代码

@RequestMapping( "/jsonTest.do")
public void jsonTest(HttpServletRequest request) {
String jsonString=request.getParameter( "jsonString");
JSONObject form=JSONObject.parseObject(jsonString);//String->JSONObject
User user= new User();
user.setUserName(form.getString( "username"));
user.setAddress(form.getInteger( "address"));
System.out.println(user.toString());
}

这样的话,前台的两个 json 数据就会自动匹配到 User 这个对象的属性中了,当然属性名称要一样的。
查看一下结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u8UNW9O6-1575037241479)(3.png)]

4、@ResponseBody:

该注解表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中,一般在异步获取数据时使用,通常是在使用 @RequestMapping 后,返回值通常解析为跳转路径,加上 @Responsebody 后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。
(1)原理:如果返回值满足 key-value 形式(对象或 map),
把前端ajax的dataType属性设置为dataType:‘application/json;charset=utf-8’,并把返回的内容转换成json字符串格式,他就会把转换后的内容输出流的形式响应给客户端。

(2)原理:如果返回值不满足 key-value,例如返回值为 String,把前端ajax的dataType属性设置为dataType:‘text/html’,并把返回值的内容以流的形式直接输出,但是如果返回内容中有中文,会出现中文乱码问题,
解决办法就是在**@RequestMapping注解中加入produces=“text/html;charset=utf-8”**,
【@RequestMapping(value=“demo12”,produces=“text/html;charset=utf-8”)】
produces属性就是表示响应头中 Content-Type 取值,告诉客户端返回的数据格式,它对应$ajax的dataType
举个例子:(前端ajax请求dataType设置为dataType:‘application/json;charset=utf-8’)【或dataType:‘text/html’】

@RequestMapping("/login")
@ResponseBody
public User login(User user){
	user.setUserName("xxx");
	user.setPwd("xxx");
	return user;
}

User 字段是:userName pwd
那么在前台接收到的数据为:{“userName”:“xxx”,“pwd”:“xxx”}的json对象【dataType:'text/html’则为字符串】
效果等同于如下代码:

  @RequestMapping("/login")
  public void login(User user, HttpServletResponse response){
    response.getWriter.write(JSONObject.fromObject(user));//Object->JSONObjct
    /*contentType:'text/html'的情况
    response.getWriter.write(JSONObject.fromObject(user).toString());
    */
  }

5、@ModelAttribute:

在方法定义上使用该注解: SpringMVC 在调用目标处理方法前, 会先逐个调用在方法级上标注了@ModelAttribute 的方法;在方法的入参前使用该注解:可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数–绑定到对象中,再传入入参将方法入参对象添加到模型中。
@ModelAttribute 注解如果用在方法参数上的话,跟不使用没区别;但如果用在方法上,则会在执行注解为@RequestMapping的方法前被调用,为模型对象入参,接着执行@RqeustMapping注解的方法,就可以来调用模型对象进行操作了。
还有因为SpringMVC会自动匹匹配页面传递过来的参数的name属性和后台控制器中的方法中的参数名,如果参数名相同,会自动匹配【也没必要用RequestParam】;如果控制器中方法是封装的bean,会自动匹配bean中的属性,其实这种取值方式不需要用@ModelAttribute注解,只要满足匹配要求,也能拿得到值

6、@RequestParam:

前端使用ajax传到后台的实体类的多个属性,直接用Map接收,整体接收参数例子
@RequestParam注解使用

处理简单类型的绑定,用 @RequestParam 绑定 HttpServletRequest 请求参数到控制器
方法参数,即在处理方法入参处使用该注解,可以把请求参数传递给请求方法。

@GetRequest("requestParam")
public String testRequestParam(
//required=false表示不传的话,会给参数赋值为null,required=true就是必须要有
@RequestParam(value="name",required=false) String myname, 
@RequestParam ( "age" ) int myage) {
return "requestParam" ;
}
//整体接收参数则这样写
//@RequestParam Map<Strong,Integer>

在上面代码中利用@RequestParam 从 HttpServletRequest 中绑定了参数 name 到控制器方法参数 name ,绑定了参数 age 到控制器方法参数 age 。在上面的代码中如果访问
/requestParam.do?name=hello&age=1 则 Spring 将会把 request 请求参数 name 的值 hello赋给对应的处理方法参数 myname ,把参数 age 的值 1 赋给对应的处理方法参数 myage 。

7、@PathVariable

绑定 URL 占位符到入参。

8、@ExceptionHandler

注解到方法上, 出现异常时会执行该方法。

9、@ControllerAdvice

使一个 Controller 成为全局的异常处理类, 类中用 ExceptinHandler
方法注解的方法可以处理所有 Controller 发生的异常。

10、@Autowired

它可以对类成员变量、方法以及构造函数进行标注,完成自动装配的工作。通过
@Autowired 的使用来消除代码 Java 代码里面的 getter/setter 与 bean 属性中的
property。当然,getter 看个人需求,如果私有属性需要对外提供的话,应当予以保留。

@Autowired@Service("")的配合使用:

实例:

@Controller
@RequestMapping("/test")
public class StudentController {
@Autowired
private StudentService studentService;
@RequestMapping("getInfo")
@ResponseBody
public int getInfo(Student student){
return studentService.insertStu(student);
}
}

在 Controller 中对私有变量用@Autowired 标注,因为 studentService 这个变量是service 层接口,所以要找到他的实现类 StudentServiceImpl,并在实现类上添加@Service("")的注释。

@Service("StudentService")
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentDao studentDao;
public int insertStu(Student student){
return studentDao.insertInfo(student);
}
}

如果不添加@Service("")注释,会报如下错误。因为@Autowired 将寻找与之匹配的 bean来创建(类名)bean,但因为删除接口实现类上@Service("")注解,找不到服务对象,
@Autowired 自然也就找不到实例 bean 了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G13oIHKw-1575037241480)(4.png)]

11、@Transactional

使用时机:
对数据库的数据进行批量或连表操作时,为了保证数据的一致性和正确性,则需要添加事务管理机制进行管理;
当对数据库的数据操作失败时,事务管理可以很好保证所有的数据 回滚 到原来的数据,如果操作成功,则保证所有的需要更新的数据持久化。

SpringMVC后台从Controller跳转到另一个Controller详解:

https://www.cnblogs.com/jpfss/p/9542550.html

当处理器对请求处理完毕后,向其它资源进行跳转时,有两种跳转方式:请求转发(rdirect:)与重定向(forward:)。可以分为两类:跳转到页面与跳转到其他处理器。
如果跳转时不带上【rdirect:或forward:】那么,默认只会以重定向的方式跳转到视图不会跳到其他controller(可用springmvc提供的方法携带参数)。

Controller方法接受参数详解(处理前端请求)


处理方法中可以包含以下五类参数,这些参数会在系统调用时由系统自动赋值,程序员可以在方法内直接使用。
还有springMVC 在方法里定义类就相当于new了这个类。public String login(User user) 那么你就可以直接用这个类了,无需new。还有一种就是当你的页面控件的Name和User类中属性一样时,你定义public String add(User user) 保存时就可以直接用xxx.add(user) 不需要一个一个定义参数了。其也是通过注解来实现的,不过这些值都有固定的默认值被初始化,也就是有默认的注解。


①. HttpServletRequest:通过 request 对象获取请求信息

常用方法:

  • getSession(boolean create)意思是返回当前reqeust中的HttpSession ,如果当前reqeust中的HttpSession 为null,当create为true,
    就创建一个新的Session,否则返回null;
HttpServletRequest request;
request.getContextPath(); 	//获取项目路径
requset..getSession(ture); 	//等同于 HttpServletRequest.getSession() 
requset.getSession(false); 	//等同于 如果当前Session没有就为null; 

在这里插入图片描述在这里插入图片描述

②. HttpServletResponse:通过 response 处理响应信息

常用方法:
Cookie(客户端,不是内置对象):Cookie是由 服务端生成的 ,再发送给客户端保存。
相当于 本地缓存的作用: 客户端(hello.mp4,zs/abc)->服务端(hello.mp4;zs/abc)
作用:提高访问服务端的效率,但是安全性较差。

void addCookie( Cookie cookie ); //服务端向客户端增加cookie对象
void sendRedirect(String location ) throws IOException;//页面跳转的一种方式(重定向)
void setContetType(String type) //设置服务端响应的编码(设置服务端的contentType类型)

在这里插入图片描述

③. HttpSession:通过 session 对象得到 session 中存放的对象(可让重定向时也能携带参数)

对session机制的理解
session(是服务端的)

  • 客户端第一次请求服务端时,(jsessionid-sessionid)服务端会产生一个session对象(用于保存该客户的信息);
  • 并且每个session对象 都会有一个唯一的 sessionId( 用于区分其他session);
  • 服务端由会 产生一个cookie,并且 该cookie的name=JSESSIONID ,value=服务端sessionId的值;
  • 然后 服务端会在 响应客户端的同时 将该cookie发送给客户端,至此 客户端就有了 一个cookie(JSESSIONID);
  • 因此,客户端的cookie就可以和服务端的session一一对应(JSESSIONID - sessionID)
  • 客户端第二/n次请求服务端时:服务端会先用客户端cookie种的JSESSIONID 去服务端的session中匹配sessionid,如果匹配成功
    (cookie jsessionid和sesion sessionid),说明此用户 不是第一次访问,无需登录;
    在这里插入图片描述在这里插入图片描述

补充: RedirectAttributers通过形参 RedirectAttributers 的 addAttribute()携带参数

  • attr.addAttribute(“param”, value);
    这种方式就相当于重定向之后,在url后面拼接参数,这样在重定向之后的页面或者控制器再去获取url后面的参数就可以了,
    但这个方式是在url后面添加参数的方式,所以暴露了参数,有风险
  • attr.addFlashAttribute(“param”, value);
    这种方式也能达到重新向带参,而且能隐藏参数,其原理就是放到session中,session在跳到页面后马上移除对象。
    在这里插入图片描述在这里插入图片描述

④. Model/ModelMap:ModelMap 是 Model 接口的实现类,通过 Model 或 ModelMap 向页面传递数据(可让重定向时也能携带参数)在这里插入图片描述

在这里插入图片描述

⑤.第五类以下重点解析:

前端传数据到后端一般是三种方式
①地址栏的url拼接的key=value&···
②表单提交数据
③ajax提交数据【一般是提交json对象的字符串,因为controller参数前加的@requestbody只能接受json对象的字符串】

  1. 逐个参数接收普通参数
    只要保证请求参数名与该请求处理方法的参数名相同即可。
    在这里插入图片描述在这里插入图片描述
  2. 校正请求参数名@RequestParam
    若请求的 URL 所携带的参数名称与处理方法中指定的参数名不相同时,则需添加一个注解@RequestParam(“请求参数名”),指定参数的名称。
    在这里插入图片描述
  3. 整体参数接收
    处理器方法的参数定义为一个对象,只要保证请求参数名与这个对象的属性同名即可。
    在这里插入图片描述在这里插入图片描述
    整体参数接收补充☞域属性参数的接收
    所谓域属性,即对象属性。当请求参数中的数据为某类对象域属性的属性值时,要求请求参数名为“域属性名.属性”。
    在这里插入图片描述
  4. 路径变量@PathVariable
    在这里插入图片描述
  5. 使用@ModelAttribute 注解获取 POST 请求的 FORM 表单数据
    (实际上,不做此注释也能拿到user对象)感觉没什么用
    它的作用是将该绑定的命令对象以“stu”为名称添加到模型对象中供视图页面展示使用。我们此时可以在视图页面使用${user.username}来获取绑定的命令对象的属性。
    在这里插入图片描述
  6. 利用注解@RequestBody
    @RequestBody【注解作用:web(otherType)–>server(json)–>server(javaObject)可用作后台整体参数接收】
    还有一种方式可以让后台接收前台传过来的参数例如以下写法
@PostMapping("/insert")
public String demo(@RequestBody Map<String, Object> map){
	map.get("a");
	map.get("b");
	server.add(map);
	return "success";
}

在这里插入图片描述
软件开发实际项目时,前端没开发完,后端可以利用 HTTP 工具先测试起来,不要等啊。
用idea的同学有福了,可以直接用自带的工具测试😍
传入的数据需要 Json 数据
选择 tools下的restful工具如图:也可以看看这篇文章https://www.cnblogs.com/heqiyoujing/p/9794910.html
在这里插入图片描述
在这里插入图片描述

最后看看SpringBoot使用RESTful风格开发Web项目

https://blog.csdn.net/Eknaij/article/details/88907340

补充thymeleaf自带的前端接受后台参数方法[其实这个也是springMVC自带的囧,因为java的map也可以实现model的功能]

https://blog.csdn.net/jclian91/article/details/79921211

推荐idea的一个好用的插件,可以用来debug页面噢😄

传送门:https://www.cnblogs.com/oukele/p/9493353.html

再补充一下关于路径的问题

可以看看这篇文章https://blog.csdn.net/cvper/article/details/79955412
虽然我现在现在用的是springboot在HTML上访问本地的资源文件,看起来和里面说的不一样,实际上访问的原理是一样的。
需要注意的是我们这里根路径【/】classpath其实是这个:看图
在这里插入图片描述

你问springboot怎么改项目根路径?看这个https://blog.csdn.net/qq_41540768/article/details/102812178

不过springboot默认是使用thymeleaf的,要访问资源的时候直接以class目录向下看来写路径就可以了
比如:

<!--//我要访问/meta/目录下的图片-->
<!--
可能你会担心设置了项目访问路径,下面这样写会访问不到,不用担心thymeleaf已经帮你考虑到了
它会在/meta前补充上classpath【如/demo/】
-->
<img th:src="@{/meta/logo/bird.png}" alt="asd"/>
<!--
可能你现在又会想为什么不直接用原生html的写法用【/】来访问根目录呢,如:
<img src="/meta/logo/bird.png" alt="asd"/>
原因是它不会加上你自己改的项目根路径它直接就是【/】那根本就不可能访问到你这项目的资源,
反而只能访问到tomcat的404页面,【看下面第一幅图】
-->
<img src="/meta/logo/bird.png" alt="asd"/>
<!--
那么在thymeleaf或原生html下的
当前目录./
上一级目录../,上上一级目录../会怎么样呢?
结果是会出问题
因为你的controller也是在地址映射的,是虚拟的地址,你的访问是交给springMVC管理的
不像在本地写html直接就是物理路径,
在你用./访问当前目录时它对应的不是文件的目录,而是你当前的虚拟路径,【看下面的第二幅图】,
理所当然会访问不到,【../  ../../ 。。。。。这些当然也同理啦】。
如下例子:
-->
<img src="./leaf128px.ico" alt="asd111"/>
<img th:src="@{./leaf128px.ico}" alt="asd111"/>

在这里插入图片描述
这是访问的结果404,原生html和thymeleaf写【./】访问资源都是这个结果,而user是我在controller下写的@RequestMapping(“user”)
在这里插入图片描述
这是我的代码和目录
在这里插入图片描述

说了这么多,其实,我也就是想告诉你,别折腾了,按thymeleaf的规矩来做就好了。

端口占用问题

https://blog.csdn.net/qq_32460751/article/details/89184093

常用js操作

json = json.substr(1); //删除第一个字符
json = json.substring(0, json.lastIndexOf(']'));//删除最后一个字符
//join() 方法用于把数组中的所有元素放入一个字符串。array-->string
//元素是通过指定的分隔符进行分隔的。如果省略参数,则使用逗号作为分隔符。
vmData.data.accmediumCode = vmData.data.accmediumCode.join(',');
//split() 方法用于把一个字符串分割成字符串数组。string-->array
msg.data.accmediumCode = msg.data.accmediumCode.split(',');
//看数据类型
console.log(toString.call(vmData.data.accmediumname));
console.log(typeof(vmData.data.accmediumname));
//json对象--->json字符串:
var person={"name":"zhangsan","sex":"男","age":"24"};//json对象
var personString = JSON.stringify(person);
//json字符串--->json对象:
var person='{"name":"zhangsan","sex":"男","age":"24"}';//json字符串
var personObject = JSON.parse(person);

问题集合

表单重复提交问题的三种解决思路
jQuery Ajax中参数data传入string类型,请求数据多一个冒号的分析
关于JQuery中 . g e t ( ) 和 .get()和 .get().post()和$.ajax()的区别和使用
jquery中文api文档
jquery的contentType可以写的主要有:

  • application/x-www-form-urlencoded;charset=UTF-8
  • application/json;charset=UTF-8
  • multipart/form-data
  • text/plain
    无论是get还是post方式默认Content-Type都是Content-Type: application/x-www-form-urlencoded;
    不过get的话数据是直接拼接到url上的,
    在这里插入图片描述
    在这里插入图片描述
    而post是放请求体上的
    在这里插入图片描述
    在这里插入图片描述
    上面出现多了个冒号**😗*这种格式是我用 . a j a x 传 到 不 知 道 为 什 么 , 如 果 我 用 .ajax传到 不知道为什么,如果我用 .ajax.post这个方法传可以带上data像这种数据 data:{}

【ps:傻逼了,这是因为我在传值时没有给他相应的key,在这里插入图片描述
而下面的情况是因为我给了key,眼瞎啊没办法,
在这里插入图片描述
在这里插入图片描述
它的原数据是这样的,它是url加密过的
附上加密工具
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值