@Controller
public class HelloController2 {
@RequestMapping(“t1”)
public String hello2(Model model){
model.addAttribute(“msg”,“HelloController2”);
return “test”;
}
}
访问路径:http://localhost:8080 / t1
同时注解类与方法
@Controller
@RequestMapping(“c3”)
public class HelloController3 {
@RequestMapping(“t1”)
public String t1(Model model){
model.addAttribute(“msg”,“HelloController3”);
return “test”;
}
}
访问路径:http://localhost:8080 /admin /t1
, 需要先指定类的路径再指定方法的路径;
概念
Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
功能
-
资源:互联网所有的事物都可以被抽象为资源
-
资源操作:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。
-
分别对应 添加、 删除、修改、查询。
传统方式操作资源 :通过不同的参数来实现不同的效果!方法单一,post 和 get
http://127.0.0.1/item/queryItem.action?id=1 查询,GET
http://127.0.0.1/item/saveItem.action 新增,POST
http://127.0.0.1/item/updateItem.action 更新,POST
http://127.0.0.1/item/deleteItem.action?id=1 删除,GET或POST
使用RESTful操作资源 :可以通过不同的请求方式来实现不同的效果!如下:请求地址一样,但是功能可以不同!
http://127.0.0.1/item/1 查询,GET
http://127.0.0.1/item 新增,POST
http://127.0.0.1/item 更新,PUT
http://127.0.0.1/item/1 删除,DELETE
4.1测试
1.在新建一个类 RestFulController
@Controller
public class RestFulController {
}
2.在Spring MVC中可以使用 @PathVariable 注解,让方法参数的值对应绑定到一个URI模板变量上。
@Controller
public class RestFulController {
@RequestMapping(“/add/{a}/{b}”)
public String t1(@PathVariable int a,@PathVariable int b, Model model) {
int res = a + b;
model.addAttribute(“msg”, “结果为:” + res);
return “test”;
}
}
3.测试请求查看下
4.思考:使用路径变量的好处?
-
使路径变得更加简洁;
-
获得参数更加方便,框架会自动进行类型转换。
-
通过路径变量的类型可以约束访问参数,如果类型不一样,则访问不到对应的请求方法,如这里访问是的路径是/add/1/a,则路径与方法不匹配,而不会是参数转换失败。
5.修改下对应的参数类型,再次测试
@Controller
public class RestFulController {
@RequestMapping(“/add/{a}/{b}”)
public String t1(@PathVariable int a,@PathVariable String b, Model model) {
String res = a + b;
model.addAttribute(“msg”, “结果为:” + res);
return “test”;
}
}
4.2使用method属性指定请求类型
用于约束请求的类型,可以收窄请求范围。指定请求谓词的类型如GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE等
1.增加一个方法
/**
-
删除方法
-
@param model
-
@return
*/
@RequestMapping(value = “hello”,method = {RequestMethod.POST})
public String delete(Model model){
model.addAttribute(“msg”,“post”);
return “test”;
}
2.我们使用浏览器地址栏进行访问默认是Get请求,会报错405:
3.如果将POST修改为GET则正常了;
@RequestMapping(value = “hello”,method = {RequestMethod.GET})
public String delete(Model model){
model.addAttribute(“msg”,“post”);
return “test”;
}
小结:
Spring MVC 的 @RequestMapping 注解能够处理 HTTP 请求的方法, 比如 GET, PUT, POST, DELETE 以及 PATCH。
所有的地址栏请求默认都会是 HTTP GET 类型的。
方法级别的注解变体有如下几个:组合注解
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@GetMapping 是一个组合注解,平时使用的会比较多!
它所扮演的是 @RequestMapping(method =RequestMethod.GET) 的一个快捷方式。
5.1ModelAndView
设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 .
页面 : {视图解析器前缀} + viewName +{视图解析器后缀}
<bean class=“org.springframework.web.servlet.view.InternalResourceViewResolver”
id=“internalResourceViewResolver”>
对应的controller类
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView model = new ModelAndView();
model.setViewName(“test”);
model.addObject(“msg”,“Hello Controller”);
return model;
}
5.2ServletAPI
通过设置ServletAPI , 不需要视图解析器 .
-
通过HttpServletResponse进行输出
-
通过HttpServletResponse实现重定向
-
通过HttpServletResponse实现转发
/**
-
往页面输出内容
-
@param req
-
@param rsp
-
@throws IOException
*/
@RequestMapping(“/result/t1”)
public void test1(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
rsp.getWriter().println(“Hello,Spring BY servlet API”);
}
/**
-
演示重定向
-
@param req
-
@param rsp
-
@throws IOException
*/
@RequestMapping(“/result/t2”)
public void test2(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
rsp.sendRedirect(“/index.jsp”);
}
/**
-
演示请求转发
-
@param req
-
@param rsp
-
@throws Exception
*/
@RequestMapping(“/result/t3”)
public void test3(HttpServletRequest req, HttpServletResponse rsp) throws Exception {
//转发
req.setAttribute(“msg”,“/result/t3”);
req.getRequestDispatcher(“/WEB-INF/jsp/test.jsp”).forward(req,rsp);
}
5.3SpringMVC
通过SpringMVC来实现转发和重定向 - 无需视图解析器;
测试前,需要将视图解析器注释掉
@RequestMapping(“/rsm/t1”)
public String test1(){
//转发
return “/index.jsp”;
}
@RequestMapping(“/rsm/t2”)
public String test2(){
//转发二
return “forward:/index.jsp”;
}
@RequestMapping(“/rsm/t3”)
public String test3(){
//重定向
return “redirect:/index.jsp”;
}
通过SpringMVC来实现转发和重定向 - 有视图解析器;
重定向 , 不需要视图解析器 , 本质就是重新请求一个新地方嘛 , 所以注意路径问题.
可以重定向到另外一个请求实现 .
6.1处理提交数据
1、提交的域名称和处理方法的参数名一致
提交数据 : http://localhost:8080/hello?name=xianyan
@RequestMapping(“t1”)
public String t1(String name, Model model, HttpSession session){
//localhost:8080/user/t1?name=xxx
//1.接收前端参数
System.out.println(“接收到前端的参数为:”+name);
//2.将返回的结果传递给前端
model.addAttribute(“msg”,name);
//3.视图跳转
return “test”;
}
2、提交的域名称和处理方法的参数名不一致
提交数据 : http://localhost:8080/hello?username=kuangshen
处理方法 :
@RequestMapping(“t1”)
public String t1(@RequestParam(“username”) String name, Model model, HttpSession session){
//localhost:8080/user/t1?name=xxx
//1.接收前端参数
System.out.println(“接收到前端的参数为:”+name);
//2.将返回的结果传递给前端
model.addAttribute(“msg”,name);
//3.视图跳转
return “test”;
}
3、提交的是一个对象
要求提交的表单域和对象的属性名一致 , 参数使用对象即可
1、实体类
@Data
public class User {
private int id;
private String name;
private int age;
}
2、提交数据的表单 :
id:
姓名:
年龄:
3、处理方法 :
@PostMapping(“t2”)
public String t2(User user){
System.out.println(user);
return “test”;
}
后台输出 :
User(id=1, name=闲言, age=18)
说明:如果使用对象的话,前端传递的参数名和对象名必须一致,否则就是null。
6.2数据显示到前端
第一种 : 通过ModelAndView
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//返回一个模型视图对象
ModelAndView mv = new ModelAndView();
mv.addObject(“msg”,“ControllerTest1”);
mv.setViewName(“test”);
return mv;
}
第二种 : 通过ModelMap
@RequestMapping(“/hello”)
public String hello(@RequestParam(“username”) String name, ModelMap model){
//封装要显示到视图中的数据
//相当于req.setAttribute(“name”,name);
model.addAttribute(“name”,name);
System.out.println(name);
return “hello”;
}
第三种 : 通过Model
@RequestMapping(“/ct2/hello”)
public String hello(@RequestParam(“username”) String name, Model model){
//封装要显示到视图中的数据
//相当于req.setAttribute(“name”,name);
model.addAttribute(“msg”,name);
System.out.println(name);
return “test”;
}
区别
就对于新手而言简单来说使用区别就是:
-
Model 只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解;
-
ModelMap 继承了 LinkedMap ,除了实现了自身的一些方法,同样的继承 LinkedMap 的方法和特性;
-
ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转
1、编写一个提交的表单
id:
姓名:
年龄:
2、后台编写对应的处理类
@Controller
public class Encoding {
@PostMapping(“/e/t1”)
public String test1(User user,Model model){
model.addAttribute(“msg”,user);
return “test”;
}
}
3、输入中文测试,发现乱码
以前乱码问题通过过滤器解决 , 而SpringMVC给我们提供了一个过滤器 , 可以在web.xml中配置
修改了xml文件需要重启服务器!
encoding
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
encoding
/*
前后端分离时代:
后端部署后端,提供接口,提供数据。
json
前端独立部署,负责渲染后端的数据。
什么是JSON?
-
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛。
-
采用完全独立于编程语言的文本格式来存储和表示数据。
-
简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
-
易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
在 JavaScript 语言中,一切都是对象。因此,任何JavaScript 支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。看看他的要求和语法格式:
-
对象表示为键值对,数据由逗号分隔
-
花括号保存对象
-
方括号保存数组
JSON 键值对是用来保存 JavaScript 对象的一种方式,和 JavaScript 对象的写法也大同小异,键/值对组合中的键名写在前面并用双引号 “” 包裹,使用冒号 : 分隔,然后紧接着值:
{“name”: “xy”}
{“age”: “18”}
{“sex”: “男”}
JSON 是 JavaScript 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。
var obj = {a: ‘Hello’, b: ‘World’}; //这是一个对象,注意键名也是可以使用引号包裹的
var json = ‘{“a”: “Hello”, “b”: “World”}’; //这是一个 JSON 字符串,本质是一个字符串
JSON 和 JavaScript 对象互转
要实现从JSON字符串转换为JavaScript 对象,使用 JSON.parse() 方法:
//将json对象转换为javaScript对象
var obj = JSON.parse(str);
console.log(obj);
要实现从JavaScript 对象转换为JSON字符串,使用 JSON.stringify() 方法:
//将js对象转换为JSON对象;
var str = JSON.stringify(user);
console.log(str);
8.1返回JSON数据 Jackson
- Jackson应该是目前比较好的json解析工具了
2. 当然工具不止这一个,比如还有阿里巴巴的 fastjson 等等。
3. 我们这里使用Jackson,使用它需要导入它的jar包;
com.fasterxml.jackson.core
jackson-databind
2.9.8
配置SpringMVC需要的配置
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”>
dispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spirngmvc.xml
1
dispatcherServlet
/
encoding
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
encoding
/*
springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns=“http://www.springframework.org/schema/beans”
xmlns:mvc=“http://www.springframework.org/schema/mvc”
xmlns:context=“http://www.springframework.org/schema/context”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package=“cn.bloghut.controller”/>
mvc:annotation-driven/
mvc:default-servlet-handler/
<bean class=“org.springframework.web.servlet.view.InternalResourceViewResolver”
id=“internalResourceViewResolver”>
这里我们需要两个新东西,一个是**@ResponseBody**,一个是ObjectMapper对象,我们看下具体的用法
编写一个Controller;
@Controller
public class JSONController {
/**
-
加了 @ResponseBody 注解之后,它就不会走视图解析器,会直接返回一个字符串
-
@return
*/
@ResponseBody
@RequestMapping(value = “j1”,produces = “application/json;charset=utf-8”)
public String json1() throws JsonProcessingException {
//创建一个对象
User user = new User(1,“闲言”,18);
//jackson,ObjectMapper
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(user);
return json;
}
}
配置Tomcat , 启动测试一下!
http://localhost:8080/j1
发现出现了乱码问题,我们需要设置一下他的编码格式为utf-8,以及它返回的类型;
通过**@RequestMaping的produces属性**来实现,修改下代码
@RequestMapping(value = “j1”,produces = “application/json;charset=utf-8”)
【注意:使用json记得处理乱码问题】
代码优化
乱码统一解决
-
上一种方法比较麻烦,如果项目中有许多请求则每一个都要添加,可以通过Spring配置统一指定,这样就不用每次都去处理了!
-
我们可以在springmvc的配置文件上添加一段消息StringHttpMessageConverter转换配置!
mvc:annotation-driven
<mvc:message-converters register-defaults=“true”>
</mvc:message-converters>
</mvc:annotation-driven>
测试集合输出
增加一个新的方法
@RequestMapping(value = “j2”)
public String json2() throws JsonProcessingException {
//创建一个对象
List list = new ArrayList<>();
list.add(new User(1,“闲言1”,18));
list.add(new User(2,“闲言2”,18));
list.add(new User(3,“闲言3”,18));
list.add(new User(4,“闲言4”,18));
//jackson,ObjectMapper
ObjectMapper objectMapper = new ObjectMapper();
//将我们的对象解析成为json格式
String json = objectMapper.writeValueAsString(list);
return json;
}
运行结果 :
输出时间对象
增加一个新的方法
@RequestMapping(value = “j3”)
public String json3() throws JsonProcessingException {
//jackson,ObjectMapper
ObjectMapper objectMapper = new ObjectMapper();
Date date = new Date();
//ObjectMapper,时间解析后的格式为:Timestamp
String json = objectMapper.writeValueAsString(date);
return json;
}
运行结果 :
默认日期格式会变成一个数字,是1970年1月1日到当前日期的毫秒数!
Jackson 默认是会把时间转成timestamps形式
解决方案:取消timestamps形式 , 自定义时间格式
@RequestMapping(value = “j4”)
public String json4() throws JsonProcessingException {
//jackson,ObjectMapper
ObjectMapper objectMapper = new ObjectMapper();
Date date = new Date();
//自定义日期格式对象
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
//ObjectMapper,时间解析后的格式为:Timestamp
String json = objectMapper.writeValueAsString(sdf.format(date));
return json;
}
运行结果 :
8.2返回JSON数据FastJson
fastjson.jar是阿里开发的一款专门用于Java开发的包,可以方便的实现json对象与JavaBean对象的转换,实现JavaBean对象与json字符串的转换,实现json对象与json字符串的转换。实现json的转换方法很多,最后的实现结果都是一样的。
fastjson 的 pom依赖!
com.alibaba
fastjson
1.2.67
fastjson 三个主要的类:
-
JSONObject 代表 json 对象
-
JSONObject实现了Map接口, 猜想 JSONObject底层操作是由Map实现的。
-
JSONObject对应json对象,通过各种形式的get()方法可以获取json对象中的数据,也可利用诸如size(),isEmpty()等方法获取"键:值"对的个数和判断是否为空。其本质是通过实现Map接口并调用接口中的方法完成的。
-
JSONArray 代表 json 对象数组
-
内部是有List接口中的方法来完成操作的。
-
JSON代表 JSONObject和JSONArray的转化
JSON类源码分析与使用
仔细观察这些方法,主要是实现json对象,json对象数组,javabean对象,json字符串之间的相互转化。
@RequestMapping(value = “j5”)
public String json5() throws JsonProcessingException {
//创建一个对象
User user1 = new User(1,“闲言1号”, 18);
User user2 = new User(2,“闲言2号”, 19);
User user3 = new User(3,“闲言3号”, 20);
User user4 = new User(4,“闲言4号”, 21);
List list = new ArrayList();
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
System.out.println(“Java对象 转 JSON字符串”);
String str1 = JSON.toJSONString(list);
System.out.println(“JSON.toJSONString(list)==>”+str1);
String str2 = JSON.toJSONString(user1);
System.out.println(“JSON.toJSONString(user1)==>”+str2);
System.out.println(“\n****** JSON字符串 转 Java对象*******”);
User jp_user1=JSON.parseObject(str2,User.class);
System.out.println(“JSON.parseObject(str2,User.class)==>”+jp_user1);
System.out.println(“\n****** Java对象 转 JSON对象 ******”);
JSONObject jsonObject1 = (JSONObject) JSON.toJSON(user2);
System.out.println(“(JSONObject) JSON.toJSON(user2)==>”+jsonObject1.getString(“name”));
System.out.println(“\n****** JSON对象 转 Java对象 ******”);
User to_java_user = JSON.toJavaObject(jsonObject1, User.class);
System.out.println(“JSON.toJavaObject(jsonObject1, User.class)==>”+to_java_user);
return JSON.toJSONString(list);
}
运行结果 :
9.1简介
-
AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。
-
AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。
-
Ajax 不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的Web应用程序的技术。
-
在 2005 年,Google 通过其 Google Suggest 使 AJAX 变得流行起来。Google Suggest能够自动帮你完成搜索单词。
-
Google Suggest 使用 AJAX 创造出动态性极强的 web 界面:当您在谷歌的搜索框输入关键字时,JavaScript 会把这些字符发送到服务器,然后服务器会返回一个搜索建议的列表。
-
就和国内百度的搜索框一样!
-
传统的网页(即不用ajax技术的网页),想要更新内容或者提交一个表单,都需要重新加载整个网页。
-
使用ajax技术的网页,通过在后台服务器进行少量的数据交换,就可以实现异步局部更新。
-
使用Ajax,用户可以创建接近本地桌面应用的直接、高可用、更丰富、更动态的Web用户界面。
9.2伪造Ajax
我们可以使用前端的一个标签来伪造一个ajax的样子。iframe标签
1、新建一个module, 导入web支持!
2、编写一个 ajax-frame.html 使用 iframe 测试,感受下效果
请输入要加载的地址:
加载页面位置:
3、使用IDEA开浏览器测试一下!
利用AJAX可以做:
-
注册时,输入用户名自动检测用户是否已经存在。
-
登陆时,提示用户名密码错误
-
删除数据行时,将行ID发送到后台,后台在数据库中删除,数据库删除成功后,在页面DOM中将数据行也删除。
…等等
JQeury 是一个库,js 的大量函数
9.3jQuery.ajax
-
Ajax的核心是XMLHttpRequest对象(XHR)。XHR为向服务器发送请求和解析服务器响应提供了接口。能够以异步方式从服务器获取新数据。
-
jQuery 提供多个与 AJAX 有关的方法。
-
通过 jQuery AJAX 方法,您能够使用 HTTP Get 和 HTTP Post 从远程服务器上请求文本、HTML、XML 或 JSON – 同时您能够把这些外部数据直接载入网页的被选元素中。
-
jQuery 不是生产者,而是大自然搬运工。
-
jQuery Ajax本质就是 XMLHttpRequest,对他进行了封装,方便调用!
jQuery.ajax(…)
部分参数:
url:请求地址
type:请求方式,GET、POST(1.9.0之后用method)
headers:请求头
data:要发送的数据
contentType:即将发送信息至服务器的内容编码类型(默认: “application/x-www-form-urlencoded; charset=UTF-8”)
async:是否异步
timeout:设置请求超时时间(毫秒)
beforeSend:发送请求前执行的函数(全局)
complete:完成之后执行的回调函数(全局)
success:成功之后执行的回调函数(全局)
error:失败之后执行的回调函数(全局)
accepts:通过请求头发送给服务器,告诉服务器当前客户端可接受的数据类型
dataType:将服务器端返回的数据转换成指定类型
“xml”: 将服务器端返回的内容转换成xml格式
“text”: 将服务器端返回的内容转换成普通文本格式
“html”: 将服务器端返回的内容转换成普通文本格式,在插入DOM中时,如果包含JavaScript标签,则会尝试去执行。
“script”: 尝试将返回值当作JavaScript去执行,然后再将服务器端返回的内容转换成普通文本格式
“json”: 将服务器端返回的内容转换成相应的JavaScript对象
“jsonp”: JSONP 格式使用 JSONP 形式调用函数时,如 “myurl?callback=?” jQuery 将自动替换 ? 为正确的函数名,以执行回调函数
9.4使用最原始的HttpServletResponse处理
1、配置web.xml 和 springmvc的配置文件【记得静态资源过滤和注解驱动配置上】
<?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”>
dispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:applicationContext.xml
1
dispatcherServlet
/
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encodingUTF-8
encodingFilter
/*
<?xml version="1.0" encoding="UTF-8"?><beans xmlns=“http://www.springframework.org/schema/beans”
xmlns:mvc=“http://www.springframework.org/schema/mvc”
xmlns:context=“http://www.springframework.org/schema/context”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package=“cn.bloghut.controller”/>
mvc:annotation-driven/
mvc:default-servlet-handler/
<bean class=“org.springframework.web.servlet.view.InternalResourceViewResolver”
id=“internalResourceViewResolver”>
2、编写一个Controller
@RequestMapping(“a1”)
public void a1(String name , HttpServletResponse response) throws Exception{
if (“admin”.equals(name)) {
response.getWriter().print(“true”);
} else {
response.getWriter().print(“false”);
}
}
3、导入jquery , 可以使用在线的CDN , 也可以下载导入
4、编写index.jsp测试
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
<%-- –%>
<%–onblur:失去焦点触发事件–%>
用户名:
5、启动tomcat测试!打开浏览器的控制台,当我们鼠标离开输入框的时候,可以看到发出了一个ajax的请求!是后台返回给我们的结果!
9.5Ajax异步加载数据
实体类user
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id;
private String name;
private int age;
}
我们来获取一个集合对象,展示到前端页面
@RequestMapping(“a2”)
public List a2(){
List users = new ArrayList<>();
users.add(new User(1,“闲言1号”,18));
users.add(new User(2,“闲言2号”,19));
users.add(new User(3,“闲言3号”,20));
users.add(new User(4,“闲言4号”,21));
return users; //由于@RestController注解,将list转成json格式返回
}
前端页面
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
启动tomcat测试!
9.6注册提示效果
思考一下我们平时注册时候,输入框后面的实时提示怎么做到的;
写一个Controller
@RequestMapping(“/a3”)
public String ajax3(String name,String pwd){
String msg = “”;
//模拟数据库中存在数据
if (name!=null){
if (“admin”.equals(name)){
msg = “OK”;
}else {
msg = “用户名输入错误”;
}
}
if (pwd!=null){
if (“123456”.equals(pwd)){
msg = “OK”;
}else {
msg = “密码输入有误”;
}
}
return msg; //由于@RestController注解,将msg转成json格式返回
}
前端页面 login.jsp
测试一下效果
10.1概述
SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。
过滤器与拦截器的区别:拦截器是AOP思想的具体应用。
过滤器
-
servlet规范中的一部分,任何java web工程都可以使用
-
在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截
拦截器
-
拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
-
拦截器只会拦截访问的控制器方法(请求), 如果访问的是jsp/html/css/image/js是不会进行拦截的
10.2自定义拦截器
那如何实现拦截器呢?
想要自定义拦截器,必须实现 HandlerInterceptor 接口。
1、新建一个Moudule , springmvc-07-Interceptor , 添加web支持
2、配置web.xml 和 springmvc-servlet.xml 文件
3、编写一个拦截器
public class MyInterceptor implements HandlerInterceptor {
/**
-
预处理回调方法
-
@param request
-
@param response
-
@param handler
-
@return
-
@throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println(“处理前”);
return true;
}
/**
-
后处理回调方法
-
@param request
-
@param response
-
@param handler
-
@param modelAndView
-
@throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println(“处理后”);
}
/**
-
整个请求处理完毕回调方法
-
@param request
-
@param response
-
@param handler
-
@param ex
-
@throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println(“清理”);
}
}
4、在springmvc的配置文件中配置拦截器
<?xml version="1.0" encoding="UTF-8"?><beans xmlns=“http://www.springframework.org/schema/beans”
xmlns:mvc=“http://www.springframework.org/schema/mvc”
xmlns:context=“http://www.springframework.org/schema/context”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package=“cn.bloghut.controller”/>
mvc:annotation-driven/
mvc:default-servlet-handler/
mvc:annotation-driven
<mvc:message-converters register-defaults=“true”>
</mvc:message-converters>
</mvc:annotation-driven>
mvc:interceptors
mvc:interceptor
<mvc:mapping path=“/**”/>
</mvc:interceptor>
</mvc:interceptors>
5、编写一个Controller,接收请求
@RequestMapping(“t1”)
public String t1() {
System.out.println(“t1 请求执行了”);
return “t1”;
}
6、前端 index.jsp
http://localhost:8080/t1
7、启动tomcat 测试一下!
10.3验证用户是否登录 (认证用户)
1、有一个登陆页面,需要写一个controller访问页面。
2、登陆页面有一提交表单的动作。需要在controller中处理。判断用户名密码是否正确。如果正确,向session中写入用户信息。返回登陆成功。
3、拦截用户请求,判断用户是否登陆。如果用户已经登陆。放行, 如果用户未登陆,跳转到登陆页面
1、编写一个登陆页面 login.jsp
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
${msg}
用户名
密码
2、编写一个Controller处理请求
@Controller
@RequestMapping(“user”)
public class LoginController {
/**
-
执行登录逻辑
-
@param user
-
@param request
-
@return
*/
@PostMapping(“login”)
public ModelAndView login(User user, HttpServletRequest request){
ModelAndView model = new ModelAndView();
/**
-
如果用户名和密码正确,将当前用户存入到session中
-
跳转到success页面
*/
if (“admin”.equals(user.getUsername()) && “123”.equals(user.getPwd())){
request.getSession().setAttribute(“user”,user);
model.setViewName(“main”);
}else {
model.addObject(“msg”,“用户名或密码错误”);
model.setViewName(“login”);
}
return model;
}
/**
-
返回登录界面
-
@return
*/
@RequestMapping(“jumplogin”)
public String jumplogin(){
System.out.println(“获取登录界面方法执行了jumplogin==”);
return “login”;
}
/**
-
注销
-
@param request
-
@return
*/
@RequestMapping(“logout”)
public String logout(HttpServletRequest request){
request.getSession().removeAttribute(“user”);
return “login”;
}
}
3、编写一个登陆成功的页面 main.jsp
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
SUCCESS
${user}
4、在 index 页面上测试跳转!启动Tomcat 测试,未登录也可以进入主页!
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
首页
<%–登录–%>
5、编写用户登录拦截器
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String uri = request.getRequestURI();
System.out.println(“请求的路径为=》”+uri);
//如果是登录请求和退出登录请求就放行
if (uri.contains(“login”) || uri.contains(“logout”)){
return true;
}
//判断什么情况下放行
Object user = request.getSession().getAttribute(“user”);
if (user != null) {
return true;
}
//转发到登录页面
request.getRequestDispatcher(“/WEB-INF/jsp/login.jsp”).forward(request,response);
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
6、在Springmvc的配置文件中注册拦截器
<?xml version="1.0" encoding="UTF-8"?><beans xmlns=“http://www.springframework.org/schema/beans”
xmlns:mvc=“http://www.springframework.org/schema/mvc”
xmlns:context=“http://www.springframework.org/schema/context”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package=“cn.bloghut.controller”/>
<mvc:annotation-driven />
<mvc:default-servlet-handler />
mvc:interceptors
mvc:interceptor
<mvc:mapping path=“/user/**”/>
</mvc:interceptor>
</mvc:interceptors>
11.1基于Springmvc方式文件上传
1、导入文件上传的jar包,commons-fileupload , Maven会自动帮我们导入他的依赖包 commons-io包;
commons-fileupload
commons-fileupload
1.3.3
javax.servlet
javax.servlet-api
4.0.1
2、配置bean:multipartResolver
【注意!!!这个bena的id必须为:multipartResolver , 否则上传文件会报400的错误】
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://i-blog.csdnimg.cn/blog_migrate/0cd40dc4365d14299169ad84a6c75c9a.jpeg)
感受:
其实我投简历的时候,都不太敢投递阿里。因为在阿里一面前已经过了字节的三次面试,投阿里的简历一直没被捞,所以以为简历就挂了。
特别感谢一面的面试官捞了我,给了我机会,同时也认可我的努力和态度。对比我的面经和其他大佬的面经,自己真的是运气好。别人8成实力,我可能8成运气。所以对我而言,我要继续加倍努力,弥补自己技术上的不足,以及与科班大佬们基础上的差距。希望自己能继续保持学习的热情,继续努力走下去。
也祝愿各位同学,都能找到自己心动的offer。
分享我在这次面试前所做的准备(刷题复习资料以及一些大佬们的学习笔记和学习路线),都已经整理成了电子文档
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
chema/context"
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package=“cn.bloghut.controller”/>
<mvc:annotation-driven />
<mvc:default-servlet-handler />
mvc:interceptors
mvc:interceptor
<mvc:mapping path=“/user/**”/>
</mvc:interceptor>
</mvc:interceptors>
11.1基于Springmvc方式文件上传
1、导入文件上传的jar包,commons-fileupload , Maven会自动帮我们导入他的依赖包 commons-io包;
commons-fileupload
commons-fileupload
1.3.3
javax.servlet
javax.servlet-api
4.0.1
2、配置bean:multipartResolver
【注意!!!这个bena的id必须为:multipartResolver , 否则上传文件会报400的错误】
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-Wkt5vHAn-1712732344684)]
[外链图片转存中…(img-bbJnzGLS-1712732344685)]
[外链图片转存中…(img-qUBpzs3l-1712732344685)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://i-blog.csdnimg.cn/blog_migrate/0cd40dc4365d14299169ad84a6c75c9a.jpeg)
感受:
其实我投简历的时候,都不太敢投递阿里。因为在阿里一面前已经过了字节的三次面试,投阿里的简历一直没被捞,所以以为简历就挂了。
特别感谢一面的面试官捞了我,给了我机会,同时也认可我的努力和态度。对比我的面经和其他大佬的面经,自己真的是运气好。别人8成实力,我可能8成运气。所以对我而言,我要继续加倍努力,弥补自己技术上的不足,以及与科班大佬们基础上的差距。希望自己能继续保持学习的热情,继续努力走下去。
也祝愿各位同学,都能找到自己心动的offer。
分享我在这次面试前所做的准备(刷题复习资料以及一些大佬们的学习笔记和学习路线),都已经整理成了电子文档
[外链图片转存中…(img-f9Wp5YHM-1712732344685)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!