springmvc
1 springmvc原理图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dSSEzjIt-1592371104588)(C:\Users\kenansama\AppData\Roaming\Typora\typora-user-images\image-20200325203315529.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zbFZ0wgC-1592371104591)(C:\Users\kenansama\AppData\Roaming\Typora\typora-user-images\image-20200325203635258.png)]
springmvc手动实现
1 在web.xml中配置 DispatcherServlet
<!--配置dispatcherServlet-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--配置文件-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-config.xml</param-value>
</init-param>
</servlet>
<!--/ 不包括jsp /* 包括jsp-->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
3 编写controller 返回一个视图解析器
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView modelAndView = new ModelAndView();
System.out.println("进入controller");
modelAndView.addObject("msg","柯南的mmmmm");
modelAndView.setViewName("hello");
return modelAndView;
}
}
4 编写配置文件 配置 处理器映射器 处理器适配器 视图解析器 以及注册我们编写的controller
<beans xmlns="http://www.springframework.org/schema/beans"
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">
<!--处理器映射器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--处理器解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--注册handler-->
<bean id="/hello" class="com.zzuli.controller.HelloController"/>
</beans>
5 注意导入jar包 建空maven项目再add frameWork 会使jar包导不进来,需要手动在webinf下建lib包并导包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-se2veW8y-1592371104592)(C:\Users\kenansama\AppData\Roaming\Typora\typora-user-images\image-20200325211214961.png)]
springmvc注解开发
1在web.xml中配置 DisPatcherServlet(同上)
2编写mvc配置文件
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--使用注解开发-->
<!--自动扫描包-->
<context:component-scan base-package="com.kenan3"/>
<!--让springmvc不处理静态资源-->
<mvc:default-servlet-handler/>
<!--自动配置注入 handlerMapping和 handlerAdapter-->
<mvc:annotation-driven/>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
3 编写Controller
@Controller
public class MyController {
/*@RequestMapping()设置真实访问地址 也可以写在类上 这样和方法的注解构成一个二级地址
如在类上写 (“/hello”) 方法上写(“/h1”) 这对应的url是/hello/h1*/
@RequestMapping("/hello")
public String hello(Model model){
//封装数据
model.addAttribute("msg","hello my name is xiaokenan nice to mi u");
return "hello"; //会被视图解析器处理
}
}
三 restful风格
介绍:
RestFul风格是一个资源定位及资源操作的风格,不是标准也不是协议。基于这个风格设计的软件可更简洁,更有层次,更易于实现缓存等机制
功能
1 资源 互联网中所有的事务都可以抽象为资源
2 资源操作 post delete put get 等
传统方式:
@Controller
public class RestFulController {
@RequestMapping("/add")
public String m1(int a, int b, Model model){
int res = a+b;
model.addAttribute("msg","结果为"+res);
return "hello";
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z8HKPmt4-1592371104594)(C:\Users\kenansama\AppData\Roaming\Typora\typora-user-images\image-20200325221313986.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wAfO0XsL-1592371104595)(C:\Users\kenansama\AppData\Roaming\Typora\typora-user-images\image-20200325221333494.png)]
RestFul实现:
//restful风格实现
//@PathVariable 路径变量 让方法参数的值绑定到url上 method 代表请求方法
// @RequestMapping(value = "/addr/{a}/{b}", method = RequestMethod.GET) 等于下面的
@GetMapping("/addr/{a}/{b}")
public String m2(@PathVariable int a,@PathVariable int b, Model model){
int res = a+b;
model.addAttribute("msg","结果为"+res);
return "hello";
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dqMZGpoe-1592371104596)(C:\Users\kenansama\AppData\Roaming\Typora\typora-user-images\image-20200325221857168.png)]
重定向和转发
使用 res rsp
@Controller
public class TestController {
@RequestMapping("/test")
public String test(HttpServletRequest request, HttpServletResponse response){
HttpSession session = request.getSession();
System.out.println(session.getId());
return "hello";
}
使用springmvc 不用视图解析器来实现重定向转发
@RequestMapping("/test/t1")
public String test(HttpServletRequest request, HttpServletResponse response){
HttpSession session = request.getSession();
session.setAttribute("name","kenan");
System.out.println(session.getId());
return "/hello.jsp";
}
@RequestMapping("/test/t2")
public String test2(Model model, HttpServletRequest request){
HttpSession session = request.getSession();
model.addAttribute("msg", session.getId()+"====="+session.getAttribute("name"));
return "/hello.jsp";
}
springmvc 数据处理
1提交的域名和处理方法的参数名一致 可以直接接受
2 不一致 在参数前加上@RequsetParam(“”)
@RequestMapping("/add/t1")
public String m1( @RequestParam("num1") int a,@RequestParam("num2") int b, Model model){
int res = a+b;
model.addAttribute("msg","结果为"+res);
return "hello";
}
注意若发布的项目名不为空 而前端action=“”中地址加了斜杠的话 会导致转发后项目名丢失 故在有项目名时不加/
有项目名时加不加都行 加/代表从根路径下加载 绝对路径 不加 是相对路径
3 传对象
//前端传的是一个对象
/**
* 1接受前端传递的参数 判断参数名字 假设名字在方法上 可以直接使用
* 2 传递的是一个对象 匹配对象字段名 需名字一致*/
@RequestMapping("/user/t2")
public String test2(User user, Model model){
System.out.println(user);
model.addAttribute("msg",user.toString());
return "test";
}
数据显示到前端
1 modelandView
2model
3 modelMap
三者区别
model 接口 功能少一些 大部分情况下够用 简化了操作
modelMap 继承了 LinkedHashMap 拥有lm的所有功能
modelandView 在存储数据的同时 可u进行设置返回逻视图 进行展示层的跳转
linkedhaspmap
乱码
使用springmvc的编码过滤器
在web.xml文件中注册filter 并配置初始参数
<!--配置springmvc的filter-->
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
前后端分离
后端提供接口 提供数据
前端独立部署 负责渲染后端的数据
使用json
<script type="text/javascript">
//编写一个js对象
var user = {name:"柯南", age:5, sex:"男"};
//将js对象转换为json对象
var s = JSON.stringify(user);
console.log(s);
console.log(user);
//将jsonn对象 转换到js对象
var parse = JSON.parse(s);
console.log(parse)
</script>
java生成json对象
1 jackson
在springmvc的配置文件中配置jsckson字符转换
<!--自动配置注入 handlerMapping和 handlerAdapter 配置jackson字符转换-->
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="failOnEmptyBeans" value="false"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
@RequestMapping("/user/t1")
@ResponseBody //不会走视图解析器 会直接返回一个字符串 也可以直接用restController注释类 其下方法都不会走视图解析器
public String test() throws JsonProcessingException {
//创建对象
User user = new User(44,"柯南",22,"男");
//jackson
ObjectMapper objectMapper = new ObjectMapper();
//转换
String s = objectMapper.writeValueAsString(user);
return s;
}
生成json数组
/**json 数组*/
@RequestMapping("/user/t2")
@ResponseBody //不会走视图解析器 会直接返回一个字符串 也可以直接用restController注释类 其下方法都不会走视图解析器
public String test2() throws JsonProcessingException {
//创建对象
User user = new User(44,"柯南",22,"男");
User user1 = new User(45,"柯南1",22,"男");
User user2 = new User(46,"柯南2",22,"男");
List<User> list = new ArrayList<User>();
list.add(user);
list.add(user1);
list.add(user2);
//jackson
ObjectMapper objectMapper = new ObjectMapper();
//转换
String s = objectMapper.writeValueAsString(list);
return s;
}
生成时间
/**返回时间*/
@RequestMapping("/user/t3")
@ResponseBody //不会走视图解析器 会直接返回一个字符串 也可以直接用restController注释类 其下方法都不会走视图解析器
public String test3() throws JsonProcessingException {
//创建对象
//jackson
ObjectMapper objectMapper = new ObjectMapper();
//转换
//objectMapper,时间解析后的格式默认为 TimeStap 时间戳
return objectMapper.writeValueAsString(new Date());
}
2 fastjson
//fastJson
String s1 = JSON.toJSONString(user);
AJAX
异步无刷新请求
web访问静态资源(css js jpg…)
1配置默认servlet 与mvc:defaut-handler/联用
他会将静态资源交给默认servlet处理
servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
2 在mvc的控制文件中 使用mvc:resources 设置静态资源路径
<!--配置静态资源文件夹-->
<mvc:resources mapping="/statics/**" location="/statics/"/>
<script src="/statics/js/jquery-3.4.1.js"></script>
ajax
使用jquery进行ajax异步访问
<script src="/statics/js/jquery-3.4.1.js"></script>
<script>
function a() {
$.post({
url:"/init/t2",
data:{"name":$("#username").val()},
success:function (data) {
alert(data);
}
})
}
</script>
<title>iframe 测试</title>
</head>
<body>
<div>
<%--失去焦点 发起一个请求到后台--%>
用户名:<input type="text" id="username" onblur="a()">
<script src="/statics/js/jquery-3.4.1.js"></script>
<script type="text/javascript">
$(function () {
$("#mybt").click(function () {
$.post("/init/t3",function (data) {
console.log(data)
})
})
})
</script>
</head>
<body>
<button id="mybt" value="test"/>
ad>
<body>
<div>
<%--失去焦点 发起一个请求到后台--%>
用户名:<input type="text" id="username" onblur="a()">
<script src="/statics/js/jquery-3.4.1.js"></script>
<script type="text/javascript">
$(function () {
$("#mybt").click(function () {
$.post("/init/t3",function (data) {
console.log(data)
})
})
})
</script>
</head>
<body>
<button id="mybt" value="test"/>