maven project
war
包 web.xml
Target Runtime
选择 Tomcat
pom.xml
<dependencies> <!-- SpringMVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.2.8.RELEASE</version> </dependency> <!-- Spring-JDBC,要和spring-webmvc的版本一致 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>3.2.8.RELEASE</version> </dependency> <!-- MyBatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <!-- MyBatis-Spring 整合jar包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.2</version> </dependency> <!-- MySQL --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.28</version> </dependency> <!-- DBCP --> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> <!-- Junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>
web.xml
) <!--配置中文乱码的过滤器--> <filter> <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!--配置前端控制器--> <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <!--加载spring配置文件--> <param-value>classpath:spring-*.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
spring-mvc.xml
@ResponseBody
这个注解来接收 Ajax
发送过来的请求,必须加上注解驱动 <mvc:annotation-driven></mvc:annotation-driven>
<!-- 组件扫描 --> <context:component-scan base-package="cn.tedu.spring.controller" /> <!-- 配置ViewResolver --> <beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"> <propertyname="prefix"value="/web/"/> <propertyname="suffix"value=".jsp"/> </bean> <!-- 配置注解扫描,用于ajax的注解扫描 --> <mvc:annotation-driven></mvc:annotation-driven>
<formaction=""method="post"> 姓名: <inputtype="text"name="name"id="name"onblur="checkName()"><spanid="nameSpan"></span><br> 密码:<inputtype="password"name="pwd"id="pwd"><spanid="pwSpan"></span><br> <inputtype="submit"value="注册"> </form>
@RequestBody
) 检测用户名
POST
视图的名称
,而是处理请求的结果,即使返回给 Ajax
请求的数据 @RequestMapping("/checkName.do") @ResponseBody //使用@ResponseBody,表示这个是处理ajax的请求 public String checkName(@RequestParam("name")String name){ if ("admin".equals(name)) { return "0"; //表示admin这个用户名不能使用,已经存在 } return "1"; //表示此时的用户名不存在,可以使用 }
Ajax
请求( JQUERY
)
JQuery
中的 Ajax
请求 <!-- 添加jquery文件 --> <scripttype="text/javascript"src="<%=request.getContextPath() %>/web/jquery-3.2.1.min.js"></script> <scripttype="text/javascript"> function checkName(){ var name=$("#name").val(); //获取用户名 if(name==""){ alert("用户名不能为空"); return; } var url="<%=request.getContextPath()%>/user/checkName.do"; // 请求的url $.post(url,{'name':name},function(responseData,status,xhr){ //如果状态码正确 if(status=="success"){ if(responseData=="0"){ //为节点添加提示内容 $("#nameSpan").text("用户名已经存在,请重新输入"); $("#nameSpan").css("color","red"); //设置颜色为红色 }else{ $("#nameSpan").text("用户名不存在,可以使用"); $("#nameSpan").css("color","green"); } } }) }` </script>
javascript
发出 Ajax
请求
GET
请求 : xhr.open("GET","<%=request.getContextPath()%>/user/checkName.do?name="+name,true);
POST
请求需要将数据封装到 xhr.send(data)
中 //使用POST请求 function checkNameFun(){ var xhr=getXHR(); //获取XHR //监听状态改变 xhr.onreadystatechange=function(){ if(xhr.readyState==4&&xhr.status==200){ var text=xhr.responseText; //获取返回的数据 if(Text=="0"){ alert("用户名已经存在,请重新输入"); }else{ alert("用户名不存在,可以使用"); } } } var name=$("#name").val(); //获取name文本框中的值 if(name==""){ alert("用户名不能为空"); return; } //编写请求 xhr.open("POST","<%=request.getContextPath()%>/user/checkName.do",true); //在open之后,send之前添加请求头信息 xhr.setRequestHeader("content-type","application/x-www-form-urlencoded"); //在send之中添加请求信息 xhr.send("name="+name); //发送请求 }
配置注解驱动支持该注解的使用,直接在 spring-mvc.xml
中配置即可 <mvc:annotation-driven></mvc:annotation-driven>
添加 jackson
的依赖,处理 json
数据
三个jar包
,我们只需要添加 jackson-databind
即可,就会自动的导入其他的两个
<!-- 添加jackson --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.4</version> </dependency>
Ajax
请求 @ResponseBody
标记的 Controller
方法的返回值,不再是返回的 视图名称
,而是返回的给 Ajax
的请求结果,可以是 String
, List
, Map
, 单个对象
等 String
, int
, boolean
@RequestMapping("/checkName.do") @ResponseBody //使用@ResponseBody,表示这个是处理ajax的请求 public String checkName(@RequestParam("name")String name){ if ("admin".equals(name)) { return "0"; //表示admin这个用户名不能使用,已经存在 } return "1"; //表示此时的用户名不存在,可以使用 }
Map<String,Object>
JackSon
,spring会将 Map
自动转换成 JSON对象
,那么我们在 JSP
中就可以用JSON来获取数据即可 Controller
方法,使用 @ResponseBody
注解 @RequestMapping("/testMap.do") @ResponseBody //使用注解 public Map<String,Object> testMap(@RequestParam("name")String name,@RequestParam("age")Integer age){ System.out.println(name+"---"+age); //接收请求参数 Map<String, Object> map=new HashMap<String, Object>(); //新建一个Map //新建User对象 User user1=new User(); user1.setName("JACK"); user1.setAge(22); User user2=new User(); user2.setAge(33); user2.setName("Tom"); //将上面的User对象添加到map中 map.put("u1",user1); map.put("u2",user2); return map; }
jsp
页面中添加一个方法,用于发出 Ajax
请求
JSON对象
),直接使用 data.key
的形式即可取出 Map
中的值 //Ajax请求testMap.do function testMap(){ var url="<%=request.getContextPath()%>/user/testMap.do"; // 请求的url var d={'name':'陈加兵','age':22}; //需要发出请求的参数 $.post(url,d,function(responseData,status,xhr){ //如果状态码正确 if(status=="success"){ var user1=responseData.u1; //取出key为u1的值,是一个user对象 var user2=responseData.u2; //取出key为u2的值,是一个user对象 alert("u1 = "+user1.name+"---"+user1.age); //打印出u1中的name,age的值 } }) }
List<Object>
JackSon
会自动将 List
转换成 JSON数组
,在 JSP
页面就可以使用 JSON
的方式来获取数据 [{"name":"JACK","age":22},{"name":"Tom","age":33},10]
,这个是一个 JSON数组
的形式,因此我们在 js
中需要遍历这个数组 Controller
中方法如下: @RequestMapping("/testList.do") @ResponseBody public List<User> testList(@RequestParam("name")String name, @RequestParam("age") Integer age) { System.out.println(name + "---" + age); // 接收请求参数 List<User> list = new ArrayList<User>(); // 新建User对象 User user1 = new User(); user1.setName("JACK"); user1.setAge(22); User user2 = new User(); user2.setAge(33); user2.setName("Tom"); //将数据添加到其中 list.add(user1); list.add(user2); return list; }
jsp
中使用发出 Ajax
请求
//Ajax请求testList.do function testList(){ var url="<%=request.getContextPath()%>/user/testList.do"; // 请求的url var d={'name':'陈加兵','age':22}; //需要发出请求的参数 $.post(url,d,function(responseData,status,xhr){ //如果状态码正确 if(status=="success"){ //此时返回的是一个数组,因此我们需要循环遍历这个数组,但是其中的元素是一个User对象,因此可以使用key-value的形式取出其中的值 for(var i=0;i<responseData.length;i++){ //将数据输出到控制台 console.log(responseData[i].name+"----->" + responseData[i].age); } } }) }
User
对象, JackSon
会将其转换成为 JSON对象
返回给浏览器 js
中可以直接使用 key-value
的形式取出其中的值 Controller
中的方法 @RequestMapping("/testObject.do") @ResponseBody public User testObject(@RequestParam("name")String name, @RequestParam("age") Integer age) { System.out.println(name + "---" + age); // 接收请求参数 User user=new User(); user.setName("JACK"); user.setAge(22); return user; }
Ajax
请求,并且接收数据
//Ajax请求testObject.do function testObject(){ var url="<%=request.getContextPath()%>/user/testObject.do"; // 请求的url var d={'name':'陈加兵','age':22}; //需要发出请求的参数 $.post(url,d,function(responseData,status,xhr){ //如果状态码正确 if(status=="success"){ console.log(responseData.name+"----"+responseData.age); } }) }
<select>
实现
省份
,在省的下拉菜单中显示出来 市
的信息,并且显示在市的下拉菜单中 省
的下拉菜单中需要使用 onchange
监听选项的改变,只要选项改变了就要发出异步请求,返回对应城市的信息 省:<selectname="province"id="province"onchange="getCity()"> <optionvalue="-1">请选择省</option> </select> 市:<selectname="city"id="city"> <optionvalue="-1">请选择市</option> </select> <!--加载jquery--> <scripttype="text/javascript"src="<%=request.getContextPath() %>/web/jquery-3.2.1.min.js"></script> <scripttype="text/javascript"> //只要页面加载完成之后就会执行其中的逻辑 $(function(){ getProvince(); //页面加载完成就调用这个方法发出异步请求 }); //获取省份的方法 function getProvince(){ var url="<%=request.getContextPath()%>/menu/getProvince.do"; //异步请求的url var d={}; //没有数据提交 $.post(url,d,function(data,status,xhr){ if(status=="success"){ //循环遍历返回的JSON数组 for(var i=0;i<data.length;i++){ //创建option,用于插入节点 var option="<option value=" + data[i].code + ">"+data[i].name+"</option>"; //将option插入到下拉列表中 $("#province").append(option); } } }); } //根据选择的省份获取市 function getCity(){ var province=$("#province").val(); //获取下拉菜单的值,这里返回的是省份的编号 var url="<%=request.getContextPath()%>/menu/getCity.do"; //异步请求的url var d={"province":province}; //将省份的编号传入 //每次都要清空之前的城市 $("#city").html("<option value='-1'>请选择市</option>"); //如果用户点击了请选择省,那么返回的值就是-1,此时不需要发出异步请求 if(province==-1){ return; } //发出异步请求 $.post(url,d,function(data,status,xhr){ if(status=="success"){ //如果返回的是一个空的,直接返回即可,不需要后续的操作 if(data.lengt==0){ return; } //循环遍历返回的JSON数组 for(var i=0;i<data.length;i++){ //创建option,用于插入节点 var option="<option value=" + data[i].code + ">"+data[i].name+"</option>"; //将option插入到下拉列表中 $("#city").append(option); } } }); } </script>
Controller
编写方法
showMenu.do
) 省份信息
的方法 城市信息
方法 //显示页面 @RequestMapping("/showMenu.do") public String showMenu(){ return "menu"; } //异步请求返回省份的信息 @RequestMapping("/getProvince.do") @ResponseBody public List<Province> getProvince(){ Province p1=new Province(); p1.setName("江苏"); p1.setCode(1001); Province p2=new Province(); p2.setName("山东"); p2.setCode(1002); List<Province> provinces=new ArrayList<Province>(); provinces.add(p1); provinces.add(p2); return provinces; } //异步获取城市信息的方法,这里没有操作数据库,仅仅是模拟,因此只要返回数据即可 @RequestMapping("/getCity.do") @ResponseBody public List<City> getCity(@RequestParam("province")Integer code){ System.out.println(code); List<City> cities=new ArrayList<City>(); /** * 如果这里涉及到数据库操作 * 1. 调用service的方法查询,service调用dao的方法查询 * 2. dao中的查询: 根据code查询出对应的城市即可,当然是联表查询 * 3. select c.name,c.code from city c join province p on c.provice_id=p.id; * 4. mybatis调用第三步的查询语句,直接返回的就是List<City>集合 */ //这里省略if的判断,主要是看效果 City c1=new City(); c1.setName("南京"); c1.setCode(123); City c2=new City(); c2.setName("淮安"); c2.setCode(1223); cities.add(c1); cities.add(c2); return cities; //返回集合 }