定义
是一个基于MVC架构的开发框架,帮助我们去快速的构建web项目,且支出JSP等其他模板
编写第一个spring-mvc文件
导入架包
导入spring-mvc.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
"
>
<!--引入context组件
使用IOC的注解扫描与支持 base-package 父路径-->
<context:component-scan base-package="com.zhongruan.web"/>
<!-- SpringMvc的扫描与注解支持-->
<mvc:annotation-driven/>
</beans>
在web.xml文件配置spring-mvc.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">
<servlet>
<servlet-name>sevlet1</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>sevlet1</servlet-name>
<!--针对客户端的请求处理:
/*: 将所有的客户端请求,都将与@RequestMappering映射地址进行匹配
/: 将根据后缀名文件直接匹配静态资源。默认无后缀名则匹配映射路径。
*.do: 根据后缀名直接用于区分映射请求和静态资源的请求。.html/*.xml/*.css
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
新建loginController类模拟登录
对映射地址进行优化,设置常量
package com.zhongruan.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.DispatcherServlet;
@Controller
@RequestMapping(LoginController.BASE_CONTROLLER)
public class LoginController {
// 优化:字符串常量的提取
public static final String BASE_CONTROLLER ="/loginController";
public static final String INDEX_PAGE = "../index.jsp";
// 模拟登录
@RequestMapping(value = {"/login"})
public String login(){
// 1、服务器的处理
System.out.println("正在登录。。。登录成功");
// 2、页面的响应
return LoginController.INDEX_PAGE;
}
}
针对客户端请求,进行参数封装
新建StudentController类
对基本类型参数传递封装
@RequestMapping(value = "/getStudentById",method = RequestMethod.GET)
public String getStudentById(Integer id,String str){
// 服务器处理
System.out.println("模拟查询 。。。 查询编号为:"+id+"字符串"+str);
// 给出页面响应
return StudentController.INDEX_PAGE;
}
对类类型进行参数封装
新建Student类
package com.zhongruan.bean;
import java.util.List;
public class Student {
private Integer id;
private String stuName;
private String age;
private List<String> subs;
@Override
public String toString() {
return "Student{" +
"id=" + id +
", stuName='" + stuName + '\'' +
", age='" + age + '\'' +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public List<String> getSubs() {
return subs;
}
public void setSubs(List<String> subs) {
this.subs = subs;
}
public Student(Integer id, String stuName, String age) {
this.id = id;
this.stuName = stuName;
this.age = age;
}
public Student() {
}
}
// 模拟新增
// 传参:首先进行student 类对象的创建,在传递对象的属性名即可
@RequestMapping("/addStu")
public String addStu(Integer id,Student stu1){
// 服务器的处理
System.out.println("ID为"+id);
System.out.println("学生的信息为"+stu1.getId()+stu1.getStuName()+stu1.getAge());
// 页面响应, 没有报404错误
return INDEX_PAGE;
}
对数组集合进行参数封装
// 根据ids 进行多查询
// 小结: 数组传递的时候,先构建数组对象在封装参数
// 小结: 一般进行集合参数封装时,是将集合定义到类中,才能识别到集合名称实现封装
@RequestMapping("/getStuByIds")
public String getStuByIds(Integer[] ids, Student stu1){
if (ids!=null) {
for (Integer id : ids) {
System.out.println("id为:" + id);
}
}
else {
System.out.println("ids为空:"+ids);
}
System.out.println("得到的集合为:"+stu1.getSubs());
return INDEX_PAGE;
}
ServletAPI
// 测试与ServletAPI的成员集成使用
@RequestMapping("/servlet_API")
public String getServletAPI(HttpServletRequest request,
HttpServletResponse response, HttpSession session){
// String parameter = request.getParameter();
// 只能到String类型
System.out.println("请求对象为:"+request);
System.out.println("session对象为:"+request.getSession());
System.out.println("响应对象为:"+response);
System.out.println("其他对象为:"+session);
return INDEX_PAGE;
}
针对客户端的的请求,给出页面响应,数据响应:
5.1:页面响应,为了页面跳转
1.直接借用ServletAPI中的request和response实现转发和重定向
request.getRequestDispatcher("../index.jsp").forward(request,response);
// 要加上根目录 request.getContextPath()
response.sendRedirect(request.getContextPath()+"../index.jsp");
2.可以直接转发或者重定向
//方式二: 可以根据字符串实现转发或者重定向
// 这样不用加根目录
// 重定向地址会改变
return "redirect:/index.jsp";
return "forward:/index.jsp";
3…也可以响应MdelAndView:该对象内部可以封装index.jsp
//方式三: 可以直接响应ModelAndView: 内部维护了页面
ModelAndView mv = new ModelAndView();
mv.setViewName("redirect:/index.jsp");
return mv;
4.也可以响应MdelAndView:该对象内部可以封装index.jsp或者直接响应页面
// 方式四: 可以直接页面字符串的地址 进行响应
return "index.jsp";
小结:二和四是同一种响应方式,如果不指定响应方式,默认是请求转发,也可以指定转发或者重定向
三 是直接将响应的页面地址封装到了 ModelAndView, 也可以去指定请求或者转发
5.2数据响应:为了提供数据到客户端(Ajax请求时)
1.如何去直接响应基本类型,引用类型,集合数据与视图绑定
1.1.可以借助ServletAPI响应
// 1、直接借用ServeletAPI实现模拟数据响应
request.setAttribute("name1","小明");
request.getSession().setAttribute("name2","小明2");
return "../index.jsp";
1.2可以借用ModelAndView直接响应
//2、借用ModelAndView对象实现数据响应
ModelAndView mv = new ModelAndView();
Student s1 = new Student(1,"小明","");
mv.addObject("s1",s1);
mv.setViewName("../index.jsp");
return mv;
1.3可以借用Model和ModelMap组件实现响应
3、借用Model 和 ModelMap 实现响应: 可以理解为从ModelAndView 拆分过来的
m.addAttribute("name3","笑花");
mm.addAttribute("name4","我的错");
mm.put("name5","下班了");
return INDEX_PAGE;
1.4可以借用注解:@ModelAttribute实现响应
1.5直接响应数据到response响应对象中,不进行视图响应
主要是用于ajax请求
5、数据响应:通过返回值直接响应到客户端,无需响应视图
当请求404无法找到方法时,可能是ajax缺少@RespondseBody
// 406:(Not Acceptable):服务端错误,表示去响应数据的时候,格式无法正常转换,需要导包
@RequestMapping("/getData2")
@ResponseBody
public String getData2(){
// 如果是针对客户端的ajax请求,需要与数据响应
// 1、直接响应字符串,传中文乱码
// return "阿斯达";
// 2、直接响应引用对象
// Student student = new Student();
// student.setId(1);
// student.setStuName("asd");
// return student;
// 3、直接响应集合
// Student s1 = new Student(1,"asd","12");
// Student s2 = new Student(2,"as","11");
// Student s3 = new Student(3,"a","10");
// List list = new ArrayList();
// list.add(s1);
// list.add(s2);
// list.add(s3);
// return list;
// 3、直接响应JSON字符串
String strJson ="{\"id\":2,\"stuName\":\"隔壁老沈\",\"age\":\"20\"}";
return strJson;
}
jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<%--发起ajax请求--%>
<script src="http://code.jquery.com/jquery-2.1.4.min.js" ></script>
<script type="text/javascript">
function f1() {
// type: 请求方式; dataType 参数类型;
// contextType: 请求的正文类型:"application/json;charset=utf-8"
$.ajax({
url:'${pageContext.request.contextPath}/studentControllerPage2/getData2.do',
type:'POST',
contextType:'application/json;charset=utf-8',
success:function (a) {
// alert('请求成功:'+a);
// 1、当服务器收到的响应对象为对象时,可以直接对象.属性
// alert(a+a.id+a.stuName);
// 2、当服务器接受到的响应是集合时,需要遍历
// $(a).each(function(index,el){
// alert('遍历:'+el+el.id+el.stuName+el.age);
// })
// 3、当服务器接收到的是JSON字符串时
// 直接把字符串转换为JSON对象
var parseJSON = $.parseJSON(a);
alert("JSON对象:"+parseJSON)
},
error:function (a) {
alert('请求失败:'+a);
}
});
}
</script>
</head>
<body>
<h1 onclick="f1()">点击响应</h1>
</body>
</html>