【狂神说Java】SpringMVC最新教程IDEA版通俗易懂

@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 , 需要先指定类的路径再指定方法的路径;


4、RestFul风格


概念

Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

功能

  • 资源:互联网所有的事物都可以被抽象为资源

  • 资源操作:使用POSTDELETEPUTGET,使用不同方法对资源进行操作。

  • 分别对应 添加删除修改查询

传统方式操作资源 :通过不同的参数来实现不同的效果!方法单一,postget

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.思考:使用路径变量的好处?

  1. 使路径变得更加简洁

  2. 获得参数更加方便,框架会自动进行类型转换

  3. 通过路径变量的类型可以约束访问参数,如果类型不一样,则访问不到对应的请求方法,如这里访问是的路径是/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、重定向和转发


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 , 不需要视图解析器 .

  1. 通过HttpServletResponse进行输出

  2. 通过HttpServletResponse实现重定向

  3. 通过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、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”;

}

区别

就对于新手而言简单来说使用区别就是:

  1. Model 只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解;

  2. ModelMap 继承了 LinkedMap ,除了实现了自身的一些方法,同样的继承 LinkedMap 的方法和特性;

  3. ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转


7、乱码问题


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

/*


8、JSON


前后端分离时代:

后端部署后端,提供接口,提供数据。

json

前端独立部署,负责渲染后端的数据。

什么是JSON?

  1. JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛。

  2. 采用完全独立于编程语言的文本格式来存储和表示数据。

  3. 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。

  4. 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

在 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

  1. 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,以及它返回的类型;

通过**@RequestMapingproduces属性**来实现,修改下代码

@RequestMapping(value = “j1”,produces = “application/json;charset=utf-8”)

在这里插入图片描述

【注意:使用json记得处理乱码问题】

代码优化

乱码统一解决

  1. 上一种方法比较麻烦,如果项目中有许多请求则每一个都要添加,可以通过Spring配置统一指定,这样就不用每次都去处理了!

  2. 我们可以在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 三个主要的类:

  1. JSONObject 代表 json 对象

  2. JSONObject实现了Map接口, 猜想 JSONObject底层操作是由Map实现的。

  3. JSONObject对应json对象,通过各种形式的get()方法可以获取json对象中的数据,也可利用诸如size(),isEmpty()等方法获取"键:值"对的个数和判断是否为空。其本质是通过实现Map接口并调用接口中的方法完成的。

  4. JSONArray 代表 json 对象数组

  5. 内部是有List接口中的方法来完成操作的。

  6. 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、Ajax研究


9.1简介

  1. AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。

  2. AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。

  3. Ajax 不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的Web应用程序的技术。

  4. 在 2005 年,Google 通过其 Google Suggest 使 AJAX 变得流行起来。Google Suggest能够自动帮你完成搜索单词。

  5. Google Suggest 使用 AJAX 创造出动态性极强的 web 界面:当您在谷歌的搜索框输入关键字时,JavaScript 会把这些字符发送到服务器,然后服务器会返回一个搜索建议的列表。

  6. 就和国内百度的搜索框一样!

  7. 传统的网页(即不用ajax技术的网页),想要更新内容或者提交一个表单,都需要重新加载整个网页。

  8. 使用ajax技术的网页,通过在后台服务器进行少量的数据交换,就可以实现异步局部更新。

  9. 使用Ajax,用户可以创建接近本地桌面应用的直接、高可用、更丰富、更动态的Web用户界面。


9.2伪造Ajax

我们可以使用前端的一个标签来伪造一个ajax的样子。iframe标签

1、新建一个module, 导入web支持!

2、编写一个 ajax-frame.html 使用 iframe 测试,感受下效果

title

请输入要加载的地址:

加载页面位置:

3、使用IDEA开浏览器测试一下!

利用AJAX可以做:

  • 注册时,输入用户名自动检测用户是否已经存在

  • 登陆时,提示用户名密码错误

  • 删除数据行时,将行ID发送到后台,后台在数据库中删除,数据库删除成功后,在页面DOM中将数据行也删除。

…等等

JQeury 是一个库,js 的大量函数


9.3jQuery.ajax

  1. Ajax的核心是XMLHttpRequest对象(XHR)。XHR为向服务器发送请求和解析服务器响应提供了接口。能够以异步方式从服务器获取新数据。

  2. jQuery 提供多个与 AJAX 有关的方法。

  3. 通过 jQuery AJAX 方法,您能够使用 HTTP Get 和 HTTP Post 从远程服务器上请求文本、HTML、XML 或 JSON – 同时您能够把这些外部数据直接载入网页的被选元素中。

  4. jQuery 不是生产者,而是大自然搬运工。

  5. 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.xmlspringmvc的配置文件【记得静态资源过滤和注解驱动配置上】

<?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” %>

$Title$

<%-- –%>

<%–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” %>

Title
id 姓名 年龄

启动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、拦截器


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” %>

$Title$

首页


<%–登录–%>

登录

成功页面

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、文件上传与下载


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

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

感受:

其实我投简历的时候,都不太敢投递阿里。因为在阿里一面前已经过了字节的三次面试,投阿里的简历一直没被捞,所以以为简历就挂了。

特别感谢一面的面试官捞了我,给了我机会,同时也认可我的努力和态度。对比我的面经和其他大佬的面经,自己真的是运气好。别人8成实力,我可能8成运气。所以对我而言,我要继续加倍努力,弥补自己技术上的不足,以及与科班大佬们基础上的差距。希望自己能继续保持学习的热情,继续努力走下去。

也祝愿各位同学,都能找到自己心动的offer。

分享我在这次面试前所做的准备(刷题复习资料以及一些大佬们的学习笔记和学习路线),都已经整理成了电子文档

拿到字节跳动offer后,简历被阿里捞了起来,二面迎来了P9"盘问"

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
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、文件上传与下载


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

感受:

其实我投简历的时候,都不太敢投递阿里。因为在阿里一面前已经过了字节的三次面试,投阿里的简历一直没被捞,所以以为简历就挂了。

特别感谢一面的面试官捞了我,给了我机会,同时也认可我的努力和态度。对比我的面经和其他大佬的面经,自己真的是运气好。别人8成实力,我可能8成运气。所以对我而言,我要继续加倍努力,弥补自己技术上的不足,以及与科班大佬们基础上的差距。希望自己能继续保持学习的热情,继续努力走下去。

也祝愿各位同学,都能找到自己心动的offer。

分享我在这次面试前所做的准备(刷题复习资料以及一些大佬们的学习笔记和学习路线),都已经整理成了电子文档

[外链图片转存中…(img-f9Wp5YHM-1712732344685)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值