spring Model and Viewer Controller 轻量级的Web Framework
springMVC主要有以下的内容:
springMVC的环境配置及入门;
springMVC的核心;response & request
springMVC的内容补充:文件上传,拦截器,异常解析;
包含上述内容的项目;
在Web项目中,可以使用ServletContextListener监听Web应用的启动,在Web应用启动时,就加载Spring的配置文件,创建ApplicationContext,并将其存储到最大的域servletContext域中,这样就可以在任意位置从域中获得ApplicationContext对象了。
(在Spring中,ApplicationContext是通过new ClasspathXmlApplicationContext(spring中的配置文件) 方式获取的);
其配置文件见附件2
附:在使用了SpringMVC框架的Web项目中,也可以再获取ApplicationContext的对象:只不过需要使用web项目中的API: WebApplicationContextUtils. 及其方法:getWebApplicationContext(servletContext);
ApplicationContext applicationContext =
WebApplicationContextUtils.getWebApplicationContext(servletContext);
Object obj = applicationContext.getBean("id");
快速入门,即执行流程:
[外链图片转存失败(img-PGf2DGh3-1565150727471)(C:\Users\19433\AppData\Local\Temp\1564840372050.png)]
[外链图片转存失败(img-KOYXmkX1-1565150727472)(C:\Users\19433\AppData\Local\Temp\1564840421120.png)]
页面跳转,返回字符串
'<bean id="ViewResolver" class=" ..............InternalResourceViewResolver">
<properpty name="prefix" value="/jsp/">
<properpty name="suffix" value="/.jsp">
bean>'
ViewResolver的工作原理:
[外链图片转存失败(img-tKLiHmSO-1565150727472)(C:\Users\19433\AppData\Local\Temp\1564962153615.png)]
页面跳转,返回标准的ModeAndView 类;
2.1 在Controller中方法返回ModelAndView对象,并且设置视图名称
@RequestMapping(value="/quick2")
public ModelAndView save2(){
/* Model:模型 作用封装数据 View:视图 作用展示数据 */
ModelAndView modelAndView = new ModelAndView();
//设置模型数据
modelAndView.addObject("username","itcast");
//设置视图名称
modelAndView.setViewName("success");
return modelAndView;
}
// 2.2 可以直接传递ModeAndView对象,不用new对象
public ModelAndView save3(ModelAndView modelAndView){
// 2.3 可以只传递Mode对象或者View对象
public String save4(Model model){
3 在Controller方法的形参上可以直接使用原生的HttpServeltRequest对象,只需声明即可:
//这里使用“huhu”存储在request域中之后,可以在success页面中取出,这样与ModeAndView 对象的作用相同:
@RequestMapping("/ma3")
public String ModelAndView(HttpServletRequest request) {
request.setAttribute("huhu", "呼彩娥呼彩娥春春红唇");
return "success";
}
<--!这里是跳转的页面,取的过程-->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
success
success!!!! 呼呼
${huhu}
@ResponseBody <<=>> response.getWriter().print(“hello world”) 回写数据:
通过SpringMVC框架注入的response对象,使用response.getWriter().print(“hello world”) 回写数据,此时不需要视图跳转,业务方法返回值为void;
将需要回写的字符串直接返回,但此时需要通过**@ResponseBody**注解告知SpringMVC框架,方法返回的字符串不是跳转是直接在http响应体中返回
@ResponseBody 其返回一个json字符串
@RequestMapping("/ma6")
@ResponseBody
public String ModelAndView3() throws Exception {
System.out.println("Controller save running....ma6");
User user = new User();
user.setUsername("huhu");
user.setAge(25);
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user);
return json; }
这里一定记住实体类转json字符串的方法:
String value = new ObjectMapper().writeValueAsString("实体类");
@ResponseBody 直接返回一个实体类(相当于转换为json字符串了,在浏览器还是以键值对的形式出现)
@RequestMapping("/ma7")
@ResponseBody //表示永远返回的是字符串
public User ModelAndView7() {
System.out.println("Controller save running....ma7");
User user = new User();
user.setUsername("春哥");
user.setAge(26);
return user;
}
关于出入的参数,里面需要的参数完全可以由地址栏获取:
@RequestMapping("/ma9")
@ResponseBody //表示永远返回的是字符串
public String ModelAndView9(String username, int age) {
System.out.println("Controller save running..../ma9");
System.out.println(username);
System.out.println(age);
return username+"...."+age;
}
浏览器视图:
[外链图片转存失败(img-zJwSvO29-1565150727473)(C:\Users\19433\AppData\Local\Temp\1565075009873.png)]
本来直接返回json字符串是有问题的,需要配置:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
list>
property>
bean>
注意:在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。
使用
自动加载 RequestMappingHandlerMapping(处理映射器)和RequestMappingHandlerAdapter( 处 理 适 配 器 ),可用在Spring-xml.xml配置文件中使用
替代注解处理器和适配器的配置。
同时使用
默认底层就会集成jackson进行对象或集合的json格式字符串的转换。
数据响应总结:
1) 页面跳转:直接返回字符串 通过ModelAndView对象返回
2) 回写数据:直接返回字符串 HttpServletResponse 对象直接写回数据,HttpServletRequest对象带回数据,Model对象带回数据或者@ResponseBody将字符串数据写回 返回对象或集合 @ResponseBody+
可以从地址栏获取数据,只要函数需要传递参数,就需要在数据,就需要数据地址栏中根据要求,进行拼接;
关于POJO
POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。
使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接. 其中有一些属性及其getter setter方法的类,没有业务逻辑,有时可以作为VO(value -object)或dto(Data Transform Object)来使用.当然,如果你有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection之类的方法。
总结:严格按照封装的类的属性名称进行数据传递传输,可以自动被服务器解析到
[外链图片转存失败(img-ULTgGsHf-1565150727473)(C:\Users\19433\AppData\Local\Temp\1564629401310.png)]
@RequestMapping("/ma11")
@ResponseBody //表示永远返回的是字符串
public String ModelAndView11(String[] argus) {
System.out.println("Controller save running..../ma11");
System.out.println(Arrays.asList(argus));
return Arrays.asList(argus).toString();
}
[外链图片转存失败(img-8JFnlkr5-1565150727473)(C:\Users\19433\AppData\Local\Temp\1565092174861.png)]
(注意这里的Student 不能传递泛型,他的泛型是List的,不能跨到下一级)
这种集合的形式,一般都是提交表单的时候需要使用的。
public class Student {
private List<User> userList;
{}表示对象
[]表示集合
不管如何都是会呈现json字符串的形式(键值对的形式)
ajax传递的代码:
Title
这里有 data:JSON.stringify(userList) 就是将上面的 Javascript 的 List对象 转换为json字符串;
/** * Converts a JavaScript value to a JavaScript Object Notation (JSON) string. * @param value A JavaScript value, usually an object or array, to be converted. * @param replacer A function that transforms the results. * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read. */
stringify(value: any, replacer?: (key: string, value: any) => any, space?: string | number): string;
controller端代码:
@RequestBody可以直接接收集合数据而无需使用POJO进行包装(也就是不使用第一种方法,使用实体类中的属性间接传递集合, 这里是利用了json字符串可以传递集合的方式。)
//使用AJAX的test类//一定注意
@RequestMapping("/ma13")
@ResponseBody //表示永远返回的是字符串
public User ModelAndView13(@RequestBody List <User> list,User user1) {
System.out.println("Controller save running..../ma13");
System.out.println(list);
for (User user : list) {
System.out.println(user);
}
System.out.println(user1);
// new ObjectMapper(list.get(0))
return user1;
}
JQeury实现方式
1. . a j a x ( ) ∗ ∗ 语 法 : .ajax() ** 语法: .ajax()∗∗语法:.ajax({键值对});//使用$.ajax()发送异步请求
$.ajax({
url:"ajaxServlet1111" , // 请求路径
type:"POST" , //请求方式
//data: "username=jack&age=23", //请求参数(拼接字符串)
data:{"username":"jack","age":23}, //json 字符串
success:function (data) {
alert(data);
}, //响应成功后的回调函数
error:function () {
alert("出错啦...") //表示请求响应出现错误,会执行的回调函数
}
dataType:"text" //设置接受到的响应数据的格式
});
关于get与post方式的简化版:
关于使用JQeury的AJAX使用
2. $.get():发送get请求
* 语法:$.get(url, [data], [callback], [type])
* 参数:
* url:请求路径
* data:请求参数
* callback:回调函数
* type:响应结果的类型
**3. $.post():发送post请求
** 语法:$.post(url, [data], [callback], [type])
** 参数: **** url:请求路径
** data:请求参数
** callback:回调函数
** type:响应结果的类型 // 默认是text
关于json注意:
数据由逗号分隔:多个键值对由逗号分隔;
花括号保存对象:使用{}定义json 格式;
方括号保存数组:[];
可以{}中嵌套[]; 也可以[]中嵌套{};
java
<filter>
<filter-name>CharacterEncodingFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>UTF-8param-value>
init-param>
filter>
<filter-mapping>
<filter-name>CharacterEncodingFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
/使用RequestParam的test类
@RequestMapping(value = "/ma14",produces = "text/application;charset=utf-8")
@ResponseBody //表示永远返回的是字符串
public String ModelAndView14(@RequestParam(value = "a", required = false, defaultValue = "默认的值 default Value !!") String s) {
System.out.println("Controller save running..../ma14");
System.out.println(s);
return s;
}
获取Servlet的API
//API的test类
@RequestMapping("/ma17")
@ResponseBody //表示永远返回的是字符串
public void ModelAndView17(HttpServletResponse response, HttpServletRequest request, HttpSession session) {
System.out.println("Controller save running..../ma17");
System.out.println(response);
System.out.println(request);
System.out.println(session);
}
//RequesterHeader test
@RequestMapping("/ma18")
@ResponseBody //表示永远返回的是字符串
// @RequestHeader(value = "User-Agent",required = false)
public void ModelAndView18(@RequestHeader(value = "Cookie", required = false) String uu) {
System.out.println("Controller save running..../ma18");
//User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36
//Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
//Cookie: JSESSIONID=108AF92133332B1BFF3115E058408359
System.out.println(uu);
}
//RequesterHeader test
@RequestMapping("/ma19")
@ResponseBody //表示永远返回的是字符串
// @RequestHeader(value = "User-Agent",required = false)
public void ModelAndView19(@CookieValue(value = "JSESSIONID", required = false) String uu) {
System.out.println("Controller save running..../ma19");
//JSESSIONID: 108AF92133332B1BFF3115E058408359
//相对于@request value="Cookie"更进了一层;
System.out.println(uu);
}
Spring-mvc第三天
<context-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:applicationContext.xmlparam-value>
context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
listener>
<servlet>
<servlet-name>DispatcherServletservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:spring_mvc.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>DispatcherServletservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
<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">
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/"/>
<property name="suffix" value=".jsp"/>
bean>
<mvc:default-servlet-handler/>
<context:component-scan base-package="com.itcast">context:component-scan>
pringframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">