SpringBoot09 自定义servlet、注册自定义的servlet、过滤器、监听器、拦截器、切面、webmvcconfigureradapter过时问题
springmvc学习
springboot中文社区
springMVC的web.xml配置详解
javaweb运作原理(web.xml是核心)
SpringMVC第四篇——处理器映射器,处理器适配器,视图解析器的配置
js时间戳与日期格式的相互转换配置文件加载的先后顺序
①
该元素包含web应用servlet上下文初始化参数的声明。
listener、filter等在初始化时可以使用这些上下文信息。在servlet中可以通过getServletContext().getInitParameter(“context/param”)方法获取参数的值
②
,
- 该元素用来注册一个监听器类。事件监听程序在①应用的启动和关闭;②session的创建与销毁,属性的新增、移除和更改;③对象被绑定到session中或从session中删除;时得到通知。
④
.声明一个Servlet数据。 其他标签说明
获取项目根路径 ${pageContext.request.contextPath }
无框架时代
一个Servlet对应于一个功能,因此 如果有增删该查(查询单个、查询全部)5个功能,则需要创建5个servlet
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对象
request.setCharacterEncoding("utf-8");
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 全局对象 全局有效(整个项目有效)
web.xml写的是为了匹配到springMVC里扫描的controller组件的位置
Servlet生命周期:5个阶段
加载
初始化: init() ,该方法会在 Servlet被加载并实例化的以后 执行
服务 :service() ->doGet() doPost
销毁 :destroy(), Servlet被系统回收时执行
卸载
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"/>
1.Spring MVC将所有请求都交由DispatchServlet进行处理。
2.DispatchServlet获取HandlerMapping(处理映射器),然后找到对应的HandlerBean处理Controller请求,并返回一个ModelAndView对象。
3.DispatchServlet查询一个或多个ViewResolver视图解析器对象, 并把视图渲染返回给前端。
SpringMVC中在加载完前置控制器(DispatchServlet)之后,会默认的加处理器映射器和处理器适配器
1) 浏览器提交请求到中央调度器
2) 中央调度器直接将请求转给处理器映射器
3) 处理映射器会根据请求,找到处理该请求的处理器,并将其封装为处理器执行链后返回给中央调度器。
4) 中央调度器根据处理器执行链中的处理器,找到能够执行该处理器的处理适配器。
5) 处理器适配器调用执行处理器
6) 处理器将处理结果及要跳转的视图封装到一个对象 ModelAndView 中,并将其返回给处理器适配器。
7) 处理器适配器直接将结果返回给中央调度器。
8) 中央调度器调用视图解析器,将 ModelAndView 中的视图名称封装为视图对象。
9) 视图解析器将封装了的视图对象返回给中央调度器。
10) 中央调度器调用视图对象,让其自已进行渲染,即进行数据填充,形成响应对象。
11) 中央调度器响应浏览器。
DispatcherServlet中央调度器,在 MVC 架构模式中充当控制器 C,DispathcerServlet 是整个流程的控制中心,由它调度诸如处理器映射器、处理器适配器、视图解析器等其它组件处理用户请求,降低了组件之间的耦合
常用的 SpringMVC 异常处理方式主要有三种:
在 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
ModelAndView的setViewName:可用请求转发和重定向
ModelMap是Model接口的实现类
SpringMVC中model有3种形式①Model②Map③ModelAndView不管用那种最终都会解析成ModelAndView
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)
在 SpringMVC 中只需要使用这个标记一个类是 Controller,然后使用@RequestMapping 和
@RequestParam 等一些注解用以定义 URL 请求和 Controller 方法之间的映射,这样的
Controller 就能被外界访问到。此外,Controller 不会直接依赖于 HttpServletRequest 和
HttpServletResponse 等 HttpServlet 对象,他们可以通过 Controller 的方法参数灵活的获取
到。
使用 @RequestMapping 来映射 Request 请求与处理器,通过这个注解可以定义不同的处理器映射规则,即为控制器指定可以处理哪些 URL 请求。用@RequestMapping 来映射 URL 到控制器类,或者是到 Controller 控制器的处理方法上。
注意:method 不写的话,默认GET、POST都支持,根据前端方式自动适应
@RequestMapping参数详解:https://my.oschina.net/liting/blog/525064
这个是介绍前后端数据发送与接收问题的
https://blog.csdn.net/zzti_erlie/article/details/90294597
用于读取 http 请求的内容(字符串),通过 springMVC 提供的 HttpMessageConverter 接口
将读取到的内容转换为 json、xml 等格式的数据,再转换为 java 对象绑定到 Controller 类方法的参数上。
简单点来说,就是把 json 格式的数据转换为 java 对象,就举个例子来说明:
编写一个 jsp 页面来向后台传递 json 格式的数据(切记是 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 这个对象的属性中了,当然属性名称要一样的。
查看一下结果:
该注解表示该方法的返回的结果直接写入 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());
*/
}
在方法定义上使用该注解: SpringMVC 在调用目标处理方法前, 会先逐个调用在方法级上标注了@ModelAttribute 的方法;在方法的入参前使用该注解:可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数–绑定到对象中,再传入入参将方法入参对象添加到模型中。
@ModelAttribute 注解如果用在方法参数上的话,跟不使用没区别;但如果用在方法上,则会在执行注解为@RequestMapping的方法前被调用,为模型对象入参,接着执行@RqeustMapping注解的方法,就可以来调用模型对象进行操作了。
还有因为SpringMVC会自动匹匹配页面传递过来的参数的name属性和后台控制器中的方法中的参数名,如果参数名相同,会自动匹配【也没必要用RequestParam】;如果控制器中方法是封装的bean,会自动匹配bean中的属性,其实这种取值方式不需要用@ModelAttribute注解,只要满足匹配要求,也能拿得到值
前端使用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
在上面代码中利用@RequestParam 从 HttpServletRequest 中绑定了参数 name 到控制器方法参数 name ,绑定了参数 age 到控制器方法参数 age 。在上面的代码中如果访问
/requestParam.do?name=hello&age=1 则 Spring 将会把 request 请求参数 name 的值 hello赋给对应的处理方法参数 myname ,把参数 age 的值 1 赋给对应的处理方法参数 myage 。
绑定 URL 占位符到入参。
注解到方法上, 出现异常时会执行该方法。
使一个 Controller 成为全局的异常处理类, 类中用 ExceptinHandler
方法注解的方法可以处理所有 Controller 发生的异常。
它可以对类成员变量、方法以及构造函数进行标注,完成自动装配的工作。通过
@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 了。
使用时机:
对数据库的数据进行批量或连表操作时,为了保证数据的一致性和正确性,则需要添加事务管理机制进行管理;
当对数据库的数据操作失败时,事务管理可以很好保证所有的数据 回滚 到原来的数据,如果操作成功,则保证所有的需要更新的数据持久化。
https://www.cnblogs.com/jpfss/p/9542550.html
当处理器对请求处理完毕后,向其它资源进行跳转时,有两种跳转方式:请求转发(rdirect:)与重定向(forward:)。可以分为两类:跳转到页面与跳转到其他处理器。
如果跳转时不带上【rdirect:或forward:】那么,默认只会以重定向的方式跳转到视图不会跳到其他controller(可用springmvc提供的方法携带参数)。
处理方法中可以包含以下五类参数,这些参数会在系统调用时由系统自动赋值,程序员可以在方法内直接使用。
还有springMVC 在方法里定义类就相当于new了这个类。public String login(User user) 那么你就可以直接用这个类了,无需new。还有一种就是当你的页面控件的Name和User类中属性一样时,你定义public String add(User user) 保存时就可以直接用xxx.add(user) 不需要一个一个定义参数了。其也是通过注解来实现的,不过这些值都有固定的默认值被初始化,也就是有默认的注解。
常用方法:
- 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;
常用方法:
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类型)
对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()携带参数
前端传数据到后端一般是三种方式
①地址栏的url拼接的key=value&···
②表单提交数据
③ajax提交数据【一般是提交json对象的字符串,因为controller参数前加的@requestbody只能接受json对象的字符串】
@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
https://blog.csdn.net/Eknaij/article/details/88907340
https://blog.csdn.net/jclian91/article/details/79921211
传送门:https://www.cnblogs.com/oukele/p/9493353.html
可以看看这篇文章https://blog.csdn.net/cvper/article/details/79955412
虽然我现在现在用的是springboot在HTML上访问本地的资源文件,看起来和里面说的不一样,实际上访问的原理是一样的。
需要注意的是我们这里根路径【/】classpath其实是这个:看图
不过springboot默认是使用thymeleaf的,要访问资源的时候直接以class目录向下看来写路径就可以了
比如:
<img th:src="@{/meta/logo/bird.png}" alt="asd"/>
<img src="/meta/logo/bird.png" alt="asd"/>
<img src="./leaf128px.ico" alt="asd111"/>
<img th:src="@{./leaf128px.ico}" alt="asd111"/>
这是访问的结果404,原生html和thymeleaf写【./】访问资源都是这个结果,而user是我在controller下写的@RequestMapping(“user”)
这是我的代码和目录
https://blog.csdn.net/qq_32460751/article/details/89184093
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可以写的主要有:
【ps:傻逼了,这是因为我在传值时没有给他相应的key,
而下面的情况是因为我给了key,眼瞎啊没办法,
】
它的原数据是这样的,它是url加密过的
附上加密工具