springMvc
1.回顾mvc
模型
- 模型(dao,service):业务逻辑,保存数据的状态
视图
- 视图(jsp,html……):展示页面
控制器
- 控制(servlet):取得表单数据,调用业务逻辑,转向指定的页面
2.认识springMvc
- 轻量级,简单易学
- 高效,基于请求响应
- 与spring可以无缝结合
- 约定优于配置
- 功能强大:restful风格,数据验证,格式化,本地化
- 简洁灵活
在以前的学习中,我们总是根据不同的需求请求不同的servlet,那么对于用户来说,这一步骤就非常麻烦,要不断的转换请求,为了解决这一问题,在原有的架构基础上面加上一层,专门用来处理这些请求,用户只需要请求 上面的一层即可。它就是DispatcherServlet
实际上这个DispatcherServlet它本身也是一个servlet。
实现原理:
快速搭建一个springmvc项目
方式一 实现类
(1)配置web文件
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc-servlet.xml
1
springmvc
/
(2)配置spring核心文件
(3)调用控制器层跳转
package com.spring.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author panglili
* @create 2022-07-25-12:01
*/
public class HelloController implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView view = new ModelAndView();
//业务代码
String result="HelloSpringMvc";
view.addObject("msg",result);
//视图跳转
view.setViewName("WEB-INF/jsp/test.jsp");
return view;
}
}
(4)视图层接受数据传给用户
Title
${msg}
方式二 注解实现
(1)配置web文件
- 跟上面实现类的相同
(2)配置spring文件
(3)控制器类实现界面跳转
package com.spring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author panglili
* @create 2022-07-25-13:15
*/
@Controller
public class hello {
@RequestMapping("/hello")
public String hello(Model md){
md.addAttribute("msg","helloooo");
return "hello";
}
}
(4)视图跳转
- 同实现类相同
3.restful风格
RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。
RESTFUL适用于移动互联网厂商作为业务接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。
实现url的定义
在发起请求的时候可以加上参数
package com.spring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author panglili
* @create 2022-07-25-13:15
*/
@Controller
public class hello {
@RequestMapping("/hello/{a}/{b}")
public String hello(@PathVariable int a,@PathVariable int b, Model md){
int res=a*b;
md.addAttribute("msg",res);
return "hello";
}
}
restful的优点
- 简洁,高效,安全性更高
也可以通过不同的请求方式实现请求路径的复用。
4.重定向与请求转发
使用servlet的请求转发
@RequestMapping("/servlet")
@ResponseBody
public String test1(HttpServletResponse res, HttpServletRequest req){
req.setAttribute("msg","helloservlet");
req.getRequestDispatcher("/hello");
return "hello";
}
使用servlet的重定向
@RequestMapping("/servlet")
@ResponseBody
public String test1(HttpServletResponse res, HttpServletRequest req) throws IOException {
req.setAttribute("msg","helloservlet");
//req.getRequestDispatcher("/hello");
res.sendRedirect("/hello");
return "hello";
}
5.使用servlet实现控制器转发请求
在控制器类使用此请求方法,实现与Model方法一样的效果
@RequestMapping("/servlet")
public String test1(HttpServletResponse res, HttpServletRequest req){
req.setAttribute("msg","helloservlet");
return "hello";
}
6.接收请求参数以及数据回显
接收普通参数
参数名与前端传递的参数名相同时
前端表单名name=name
$Title$
username:
后端收到的参数名String name
@RequestMapping("/hello")
public String hello(String name, Model md){
md.addAttribute("msg",name);
return "hello";
}
因此可以直接将前端的参数拿到
参数名与前端传递的参数名不同时或者有多个参数取一个时
- 名字相同时可以直接取到
@RequestMapping("/hello")
public String hello(String name, Model md){
md.addAttribute("msg",name);
return "hello";
}
* 在参数前面加上你要取得前端参数名称,就可以取到指定的数据
@RequestMapping("/hello")
public String hello(@RequestParam("name") String name, Model md){
md.addAttribute("msg",name);
return "hello";
}
@RequestMapping("/hello")
public String hello(@RequestParam("pwd") String name, Model md){
md.addAttribute("msg",name);
return "hello";
}
接收对象
前端数据与对象数据名严格匹配,不配时使用@RequestParam,传入的属性不对应时缺少的属性会为空。
对象实体类
package com.spring.pojo;
import lombok.Data;
/**
* @author panglili
* @create 2022-07-25-19:45
*/
@Data
public class User {
private String name;
private String pwd;
private int age;
private String email;
}
前端界面
$Title$
username:
password:
password:
password:
后台接受
@RequestMapping("/hello")
public String hello(User user, Model md){
md.addAttribute("msg",user);
return "hello";
}
界面显示
7.乱码问题
在web服务器配置中直接加上下面的过滤处理
encoding
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
forceEncoding
true
encoding
/*
8.json
- 前后端分离时代,前后端工程师约定的方便数据交换格式
JSON(JavaScript Object Notation, JS对象简谱)是一种 轻量级的数据交换格式。采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
json转换为js对象
//将json转json
var obj =JSON.parse(json);
console.log(obj);
js对象转换为json字符串
//将js转换为json
var json= JSON.stringify(people);
console.log(json);
Title
var people={
name:"哔哩哔哩",
age:100,
address:"www.bilibili.com"
};
//将js转换为json
var json= JSON.stringify(people);
console.log(json);
//将json转json
var obj =JSON.parse(json);
console.log(obj);
jackson使用
导包
com.fasterxml.jackson.core
jackson-core
2.13.3
com.fasterxml.jackson.core
jackson-databind
2.13.3
Jackson转换java和json数据格式
package com.spring.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.spring.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @author panglili
* @create 2022-07-25-20:36
*/
@Controller
public class JsonController {
//produces = "application/json;charset=utf-8"
//json提供的数据编码处理
@ResponseBody
@RequestMapping(value = "/json",produces = "application/json;charset=utf-8")
public String json1() throws JsonProcessingException {
//jsckson 提供的将一个json字符与java对象自动转换的类
ObjectMapper mapper = new ObjectMapper();
//创建对象
User user=new User("小镇",19,"男");
//交给mapper转换
String s = mapper.writeValueAsString(user);
return s;
}
}
json处理乱码还有一种方式,直接配置在mvc中,不需要每个请求上面都去搞
fastjson的使用
- Fastjson是一个Java语言编写的JSON处理器,由阿里巴巴公司开发。
导包
com.alibaba
fastjson
1.2.72
直接调用它提供的JSON对象
@RequestMapping("/j2")
@ResponseBody
public String json(){
User user=new User("小镇",19,"男");
String s = JSON.toJSONString(user);
return s;
}
9.ssm整合框架
此整合没有具体的业务,因为ssm整合最难的点就在于配置文件的整合,因此这里只详细记录配置文件的整合
- spring和dao整合将mybatis的配置文件的数据库连接和sqlsessionfactory的功能
- spring和service整合将业务层的事务和日志利用aop实现
- spring和mvc整合实现视图跳转
总之,spring这个大容器将所有的事情包揽,统一的控制
1.spring和dao
2.spring和service
3.spring和mvc
最后将这几个spring的配置文件导入到一个applicationContext的配置文件即可
10.Ajax异步请求
- Ajax即 Asynchronous Javascript And XML(异步JavaScript和XML在 2005年被Jesse James Garrett提出的新术语,用来描述一种使用现有技术集合的’新’方法 。 使用Ajax技术网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面,这使得程序能够更快地回应用户的操作。
总之就是异步无刷新的请求
使用jQuery的库实现ajax
ajax
function ajax() {
$.post({
url:"${pageContext.request.contextPath}/ajax/j1",
data:{"name":$("#username").val()},
success:function(data){
alert(data);
}
})
}
name:
@RequestMapping("/ajax/j1")
@ResponseBody
public void ajax(String name, HttpServletResponse res) throws IOException {
System.out.println(name+"this is name value");
if(name.equals("panglili")){
res.getWriter().write("true");
}else{
res.getWriter().write("false");
}
}
在表单失去焦点的一瞬间,前端就向后台发起了ajax异步请求
使用ajax实现前后台对象数据交换
- 下面是jsp代码,当前台点击加载数据的时候,就会异步处理去后台拿取到所有用户的数据显示在前台
ajax
function ajax() {
$.post({
url:"${pageContext.request.contextPath}/ajax/j2",
// data:{"name":$("#username").val()},
success:function(data){
var html="";
for(var i=0;i<data.length;i++){
html+="<tr>"+
"<td>"+data[i].name+"</td>"+
"<td>"+data[i].age+"</td>"+
"<td>"+data[i].sex+"</td>"+
"</tr>"
}
$("#tab").html(html);
}
});
}
name
age
sex
- 下面是后台代码,当收到前端请求,返回所有数据,在前后台分离时代,前端与后台只需做好各自的事情,实现相应的交接即可。
@RequestMapping("/ajax/j2")
@ResponseBody
public List ajax2(){
//模拟实体类为数据库数据
ArrayList users = new ArrayList();
User user1 = new User("xiaoming",19,"nan");
User user2 = new User("xiaozhang",19,"nan");
User user3 = new User("xiaohong",19,"nan");
users.add(user1);
users.add(user2);
users.add(user3);
return users;
}
11.拦截器
- 只会拦截controller的请求,对于静态资源不处理
被spring代理的拦截器实现只需要两步:
1.实现一个拦截器类
package com.spring.config;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author panglili
* @create 2022-07-26-13:43
*/
//继承一个拦截器
public class MyInterceptor implements HandlerInterceptor {
//true 放行
//false 不放行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("处理前-------------");
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("处理后-------------");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("清理—--------------");
}
}
2.配置拦截器
Original: https://www.cnblogs.com/lumanmanqixiuyuanxi/p/16544589.html
Author: 路漫漫qixiuyuanxi
Title: [springmvc]springmvc超详细总结笔记
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/619545/
转载文章受原作者版权保护。转载请注明原作者出处!