SpringMVC(一)
2016-07-11 21:25
507 查看
SpringMVC
1.结构最清晰的MVC Model2实现
2.Controller
3.ModeAndView
处理请求流程:
框架模型:
特点:
1.清晰划分角色
2.灵活的配置功能
3.提供大量的控制器接口和实现类
4.与真正的View层实现无关(JSP,Velocity,Xslt等)
5.国际化支持
6.面向接口编程
7.Spring提供了Web应用开发的一整套流程,不仅是MVC,他们之间可以很方便的结合一起
步骤:
1.添加jar包
2.编写配置文件及其代码
a.web.xml
b.dispatherService-servlet.xml(SpringMVC的配置文件)
c.controller等代码实现
范例:
1.web.xml
2.SpringMVC的配置文件
a1.默认:BeanNameUrlHandlerMapping -- SpringMVC-servlet.xml
a2.默认:BeanNameUrlHandlerMapping可省略不写 -- SpringMVC-servlet.xml
a3.常见: ControllerClassNameHandlerMapping -- SpringMVC-servlet.xml
a3.常见: ControllerClassNameHandlerMapping,name属性不写 -- SpringMVC-servlet.xml
a4.常见: ControllerClassNameHandlerMapping,name="/test" -- SpringMVC-servlet.xml
★★注意:当用了ControllerClassNameHandlerMapping时,页面找到的是Controller类,与name属性无关
1.hello(后缀没有controller),那么SpringMVC会自动补全
2.helloController,SpringMVC会先寻找是否有匹配的controller类,再自动显示页面
3.controller包
a.HelloController
HandlerMapping:
a.BeanNameUrlHandlerMapping
根据控制器Bean的名字将控制器映射到URL
b.ControllerBeanNameHandlerMapping
c.ControllerClassNameHandlerMapping
d.SimpleUrlHandlerMapping
e.DefaultAnnotationHandlerMapping
将请求映射给使用@RequestMapping注解的控制器和控制方法
视图解析器:
1.将逻辑视图的名字与JSP等视图技术进行匹配
2.InternalResourceViewResolver
a.在Web应用程序的WAR文件中查找视图模板,视图模板的路径根据加完前缀和后缀的逻辑视图名称来确定
b.prefix
c.suffix
范例:
使用SpringMVC实现登录功能
1.步骤:
1).controller类继承AbstractController重写handleRequestInternal方法
2).通过request获取参数
3).判断用户登录是否成功
范例:
2.优化登陆
1)Spring提供了多功能控制器和地址解析器来处理
a.MultiActionController
a.支持多请求处理
b.可以自定义处理请求的方法
c.语法:public ModelAndView actionName(HttpServletRequest request, HttpServletResponse response, [,HttpSession session] [,AnyObject]);
actionName: 请求的方法名,可以和URL地址对应
request: 自动注入的HttpServletRequest对象
response: 自动注入的HttpServletResponse对象
session: 自动注入的HttpSession对象,可选参数
AnyObject: 可选参数,一般用于参数注入
b.InternalPathMethodNameResolver
c.ParameterMethodNameResolver
2)编写UserController -- 继承MultiActionController
范例:
3)使用默认设置配置bean
范例:
4)使用SimpleUrlHandlerMapping映射
a.映射Controller
b.映射Controller中的方法
范例:
5)实现服务器端的验证
a.SpringMVC提供的Validator接口来实现验证
1.编写实现Validator接口验证器代码
2.注入验证器到MultiActionController中的validators属性中
b.实现自定义验证器
1.验证器中的方法
a.重写supports方法 -- 检查验证器是否匹配需要验证的实体
b.重写validate(Object target, Errors errors)方法 -- 实现验证逻辑
范例:
2.注入验证器
a.将验证器注入到Controller -- Validators是一个数组
范例:
6)显示错误验证信息
1.处理绑定异常
范例:
2.页面使用SpringMVC标签显示错误信息 -- 引入spring表单标签
a.<%@ taglib uri="http://www.springframework.org/tags/form" prefix="fm" %>
b.使用spring的form标签创建提交的表单
c.使用errors标签显示验证信息
范例:
范例:
1.entity包
a.User
2.controller包
a.UserController
a1.添加对象外的属性 -- UserController
a2.添加对象外的属性(手动绑定参数) -- UserController
a3.添加对象外的属性(两次调用bind()方法) -- UserController
a4.
3.动态工程的配置文件
a1.web.xml
a2.验证 -- web.xml
4.SpringMVC的配置文件
a1.SimpleUrl映射 -- SpringMVC-servlet.xml
5.Spring的配置文件
a.applicationContext.xml
6.jsp
a.login.jsp
a2.调用两次bind()方法 -- login.jsp
a3.Spring标签 -- login.jsp
b.reg.jsp
1.结构最清晰的MVC Model2实现
2.Controller
3.ModeAndView
处理请求流程:
框架模型:
特点:
1.清晰划分角色
2.灵活的配置功能
3.提供大量的控制器接口和实现类
4.与真正的View层实现无关(JSP,Velocity,Xslt等)
5.国际化支持
6.面向接口编程
7.Spring提供了Web应用开发的一整套流程,不仅是MVC,他们之间可以很方便的结合一起
步骤:
1.添加jar包
2.编写配置文件及其代码
a.web.xml
b.dispatherService-servlet.xml(SpringMVC的配置文件)
c.controller等代码实现
范例:
1.web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>SpringMVCDemo1_ivy</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- 配置SpringMVC拦截器(servlet) --> <servlet> <servlet-name>SpringMVC</servlet-name> <!-- 配置SpringMVC的前置拦截器,用于拦截匹配的请求 --> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 指定SpringMVC配置文件的路径 --> <init-param> <param-name>contextConfigLocation</param-name> <!-- 指定SpringMVC的配置文件.默认读取在/WEB-INF/目录下的以DispatcherServlet的servlet-name拼接-servlet.xml的文件 --> <!-- classpath前缀名字与servlet-name一致 --> <param-value>classpath:SpringMVC-servlet.xml</param-value> </init-param> <!-- 启动web容器时,加载servlet并初始化。数字越小,启动速度越快 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <!-- 指定需要拦截的URL地址。/:根路径下所有的文件 --> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
2.SpringMVC的配置文件
a1.默认:BeanNameUrlHandlerMapping -- SpringMVC-servlet.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:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"> <!-- 配置SpringMVC url地址映射 --> <!-- 配置hanldelMapping指定以何种方式实现映射 --> <!-- 1.默认:BeanNameUrlHandlerMapping --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean> <!-- 配置指定的Controller --> <bean name="/hello" class="com.Elastic.SpringMVCDemo1.ivy.controller.HelloController"></bean> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 视图解释的前缀名称 --> <!-- /:项目根目录。加在HelloController的逻辑视图名称。 --> <property name="prefix" value="/"></property> <!-- 视图解析的后缀名称 --> <property name="suffix" value=".jsp"></property> </bean> </beans>
a2.默认:BeanNameUrlHandlerMapping可省略不写 -- SpringMVC-servlet.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:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"> <!-- 配置SpringMVC url地址映射 --> <!-- 配置hanldelMapping指定以何种方式实现映射 --> <!-- 1.默认:BeanNameUrlHandlerMapping --> <!-- <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean> --> <!-- 配置指定的Controller --> <bean name="/hello" class="com.Elastic.SpringMVCDemo1.ivy.controller.HelloController"></bean> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 视图解释的前缀名称 --> <!-- /:项目根目录。加在HelloController的逻辑视图名称。 --> <property name="prefix" value="/"></property> <!-- 视图解析的后缀名称 --> <property name="suffix" value=".jsp"></property> </bean> </beans>
a3.常见: ControllerClassNameHandlerMapping -- SpringMVC-servlet.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:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"> <!-- 配置SpringMVC url地址映射 --> <!-- 配置hanldelMapping指定以何种方式实现映射 --> <!-- 2.常见: ControllerClassNameHandlerMapping --> <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean> <!-- 配置指定的Controller --> <bean name="/hello" class="com.Elastic.SpringMVCDemo1.ivy.controller.HelloController"></bean> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 视图解释的前缀名称 --> <!-- /:项目根目录。加在HelloController的逻辑视图名称。 --> <property name="prefix" value="/"></property> <!-- 视图解析的后缀名称 --> <property name="suffix" value=".jsp"></property> </bean> </beans>
a3.常见: ControllerClassNameHandlerMapping,name属性不写 -- SpringMVC-servlet.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:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"> <!-- 配置SpringMVC url地址映射 --> <!-- 配置hanldelMapping指定以何种方式实现映射 --> <!-- 2.常见: ControllerClassNameHandlerMapping --> <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean> <!-- 配置指定的Controller --> <bean class="com.Elastic.SpringMVCDemo1.ivy.controller.HelloController"></bean> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 视图解释的前缀名称 --> <!-- /:项目根目录。加在HelloController的逻辑视图名称。 --> <property name="prefix" value="/"></property> <!-- 视图解析的后缀名称 --> <property name="suffix" value=".jsp"></property> </bean> </beans>
a4.常见: ControllerClassNameHandlerMapping,name="/test" -- SpringMVC-servlet.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:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"> <!-- 配置SpringMVC url地址映射 --> <!-- 配置hanldelMapping指定以何种方式实现映射 --> <!-- 2.常见: ControllerClassNameHandlerMapping --> <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean> <!-- 配置指定的Controller --> <bean name="/test" class="com.Elastic.SpringMVCDemo1.ivy.controller.HelloController"></bean> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 视图解释的前缀名称 --> <!-- /:项目根目录。加在HelloController的逻辑视图名称。 --> <property name="prefix" value="/"></property> <!-- 视图解析的后缀名称 --> <property name="suffix" value=".jsp"></property> </bean> </beans>
★★注意:当用了ControllerClassNameHandlerMapping时,页面找到的是Controller类,与name属性无关
1.hello(后缀没有controller),那么SpringMVC会自动补全
2.helloController,SpringMVC会先寻找是否有匹配的controller类,再自动显示页面
3.controller包
a.HelloController
package com.Elastic.SpringMVCDemo1.ivy.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractController; //相当于struts中的Action,用于接收用户的请求并响应结果 public class HelloController extends AbstractController{ // 相当于struts中的execute @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("进入了HelloController"); // 返回模型和试图 /*设置响应请求对应的页面 参数hello是一个逻辑视图名称 通过视图解析器指定真正的页面 */ return new ModelAndView("jsp/hello"); } }
HandlerMapping:
a.BeanNameUrlHandlerMapping
根据控制器Bean的名字将控制器映射到URL
b.ControllerBeanNameHandlerMapping
c.ControllerClassNameHandlerMapping
d.SimpleUrlHandlerMapping
e.DefaultAnnotationHandlerMapping
将请求映射给使用@RequestMapping注解的控制器和控制方法
视图解析器:
1.将逻辑视图的名字与JSP等视图技术进行匹配
2.InternalResourceViewResolver
a.在Web应用程序的WAR文件中查找视图模板,视图模板的路径根据加完前缀和后缀的逻辑视图名称来确定
b.prefix
c.suffix
范例:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" > <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean>
使用SpringMVC实现登录功能
1.步骤:
1).controller类继承AbstractController重写handleRequestInternal方法
2).通过request获取参数
3).判断用户登录是否成功
范例:
public class LoginController extends AbstractController { @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { String name = request.getParameter("loginName"); String pass = request.getParameter("loginPass"); if (name.equals("admin") && pass.equals("123456")) { return new ModelAndView("index"); } return new ModelAndView("error"); } }
2.优化登陆
1)Spring提供了多功能控制器和地址解析器来处理
a.MultiActionController
a.支持多请求处理
b.可以自定义处理请求的方法
c.语法:public ModelAndView actionName(HttpServletRequest request, HttpServletResponse response, [,HttpSession session] [,AnyObject]);
actionName: 请求的方法名,可以和URL地址对应
request: 自动注入的HttpServletRequest对象
response: 自动注入的HttpServletResponse对象
session: 自动注入的HttpSession对象,可选参数
AnyObject: 可选参数,一般用于参数注入
b.InternalPathMethodNameResolver
c.ParameterMethodNameResolver
2)编写UserController -- 继承MultiActionController
范例:
public class UserController extends MultiActionController { public ModelAndView login(HttpServletRequest request, HttpServletResponse response) { //绑定请求的参数到user对象中,表单元素:<input name="name">对应user中的name属性 User user = (User) newCommandObject(User.class); bind(request, user); // 省略登录部分代码 …… } }
3)使用默认设置配置bean
范例:
<!-- SpringMVC默认的地址映射,可以省略 --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean> <!-- MultiActionController默认使用InternalPathMethodNameResolver映射Controller中的方法,可以省略 --> <bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver"></bean> <!-- 对应Controller中的login方法 --> <bean name="/login" class="com.xuetang9.demo.controller.UserController"> <property name="methodNameResolver" ref="methodNameResolver"></property> </bean>
4)使用SimpleUrlHandlerMapping映射
a.映射Controller
b.映射Controller中的方法
范例:
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <!-- 以/user/开头的URL地址都访问id为userController的控制器,*--指定Controller中需要调用的方法 --> <prop key="/user/*">userController</prop> </props> </property> </bean> <bean id="userController" class="com.xuetang9.demo.controller.UserController"></bean>
5)实现服务器端的验证
a.SpringMVC提供的Validator接口来实现验证
1.编写实现Validator接口验证器代码
2.注入验证器到MultiActionController中的validators属性中
b.实现自定义验证器
1.验证器中的方法
a.重写supports方法 -- 检查验证器是否匹配需要验证的实体
b.重写validate(Object target, Errors errors)方法 -- 实现验证逻辑
范例:
public class UserValidator implements Validator { //用于SpringMVC检查是否是指定类型的验证器 //返回true执行后续验证,返回false跳过验证 @Override public boolean supports(Class<?> clazz) { return clazz == User.class; } @Override public void validate(Object target, Errors errors) { User user = (User) target; //需要验证的对象需要强转类型 /* Spring提供用于非空验证的工具类 4个参数依次是: 保存验证信息的对象,验证的字段名, 验证信息的键值,验证信息的内容 */ ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "name.required", "用户名不能为空"); ValidationUtils.rejectIfEmpty(errors, "pass", "pass.required", "密码不能为空"); if (user.getPass().length() < 6 || user.getPass().length() > 12) { //将验证信息放入到errors对象中 errors.rejectValue("pass", "pass.length", "密码长度必须在6-12位之间"); } } }
2.注入验证器
a.将验证器注入到Controller -- Validators是一个数组
范例:
<!-- 配置验证器 --> <bean id="userValidator" class="com.xuetang9.demo.validator.UserValidator"></bean> <!-- 配置Controller--> <bean id="userController" class="com.xuetang9.demo.controller.UserController"> <property name="validators"> <list> <!-- 注入验证器 --> <ref bean="userValidator"/> </list> </property> </bean>
6)显示错误验证信息
1.处理绑定异常
范例:
User user = (User) newCommandObject(User.class); try { bind(request, user); } catch (ServletRequestBindingException e) { BindException bindException = (BindException) e.getCause(); return new ModelAndView("login").addAllObjects(bindException.getModel()); }
2.页面使用SpringMVC标签显示错误信息 -- 引入spring表单标签
a.<%@ taglib uri="http://www.springframework.org/tags/form" prefix="fm" %>
b.使用spring的form标签创建提交的表单
c.使用errors标签显示验证信息
范例:
<fm:form action="user/login" method="post"> <input name="name" type="text"> <fm:errors path="name"></fm:errors> <input name="pass" type="password"> <fm:errors path="pass"></fm:errors> <input type="submit" value="登陆"> </fm:form>
范例:
1.entity包
a.User
package com.Elastic.SpringMVCDemo1.ivy.entity; import java.io.Serializable; public class User implements Serializable { private String name; private String pass; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } }
2.controller包
a.UserController
package com.Elastic.SpringMVCDemo1.ivy.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.multiaction.MultiActionController; import com.Elastic.SpringMVCDemo1.ivy.entity.User; public class UserController extends MultiActionController { public ModelAndView login(HttpServletRequest request, HttpServletResponse response,User user) { System.out.println("登录功能"); System.out.println(user.getName()); return new ModelAndView("index"); } public ModelAndView registe(HttpServletRequest request, HttpServletResponse response,User user) { System.out.println("注册功能"); System.out.println(user.getName()); return new ModelAndView("index"); } }
a1.添加对象外的属性 -- UserController
package com.Elastic.SpringMVCDemo1.ivy.controller; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.multiaction.MultiActionController; import com.Elastic.SpringMVCDemo1.ivy.entity.User; public class UserController extends MultiActionController { private User user; private String code; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public ModelAndView login(HttpServletRequest request, HttpServletResponse response, UserController controller) { System.out.println("登录功能"); System.out.println(this.hashCode()); System.out.println(controller.hashCode()); System.out.println(controller.code); System.out.println(controller.user.getName()); return new ModelAndView("index"); } public ModelAndView registe(HttpServletRequest request, HttpServletResponse response,User user) { System.out.println("注册功能"); System.out.println(user.getName()); return new ModelAndView("index"); } }
a2.添加对象外的属性(手动绑定参数) -- UserController
package com.Elastic.SpringMVCDemo1.ivy.controller; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.multiaction.MultiActionController; import com.Elastic.SpringMVCDemo1.ivy.entity.User; public class UserController extends MultiActionController { private User user; private String code; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public ModelAndView login(HttpServletRequest request, HttpServletResponse response) { //手动绑定参数 try { this.bind(request, this); } catch (Exception e) { e.printStackTrace(); } System.out.println("登录功能"); System.out.println(this.hashCode()); // System.out.println(controller.hashCode()); System.out.println(this.code); System.out.println(user.getName()); return new ModelAndView("index"); } public ModelAndView registe(HttpServletRequest request, HttpServletResponse response,User user) { System.out.println("注册功能"); System.out.println(user.getName()); return new ModelAndView("index"); } }
a3.添加对象外的属性(两次调用bind()方法) -- UserController
package com.Elastic.SpringMVCDemo1.ivy.controller; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.multiaction.MultiActionController; import com.Elastic.SpringMVCDemo1.ivy.entity.User; public class UserController extends MultiActionController { private User user; private String code; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public ModelAndView login(HttpServletRequest request, HttpServletResponse response) { //手动绑定参数 try { this.bind(request, this); user = new User(); this.bind(request, user); } catch (Exception e) { e.printStackTrace(); } System.out.println("登录功能"); System.out.println(this.hashCode()); // System.out.println(controller.hashCode()); System.out.println(this.code); System.out.println(this.user.getName()); return new ModelAndView("index"); } public ModelAndView registe(HttpServletRequest request, HttpServletResponse response,User user) { System.out.println("注册功能"); System.out.println(user.getName()); return new ModelAndView("index"); } }
a4.
package com.Elastic.SpringMVCDemo1.ivy.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.validation.BindException; import org.springframework.validation.Errors; import org.springframework.validation.ValidationUtils; import org.springframework.validation.Validator; import org.springframework.web.bind.ServletRequestBindingException; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.multiaction.MultiActionController; import com.Elastic.SpringMVCDemo1.ivy.entity.User; public class UserController extends MultiActionController implements Validator{ private User user; private String code; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public ModelAndView login(HttpServletRequest request, HttpServletResponse response) throws Exception{ //手动绑定参数 try { this.bind(request, this); //捕获绑定异常 } catch (ServletRequestBindingException e) { BindException bindException = (BindException) e.getCause(); System.out.println(bindException); //方法一 // return new ModelAndView("login",bindException.getModel()); //方法二 ModelAndView mv = new ModelAndView(); mv.setViewName("login"); mv.addAllObjects(bindException.getModel()); return mv; } System.out.println("登录功能"); System.out.println(this.hashCode()); System.out.println(user.getName()); System.out.println(this.code); return new ModelAndView("index"); } public ModelAndView registe(HttpServletRequest request, HttpServletResponse response,User user) { System.out.println("注册功能"); System.out.println(user.getName()); return new ModelAndView("index"); } @Override public boolean supports(Class<?> clazz) { return clazz == this.getClass(); } @Override public void validate(Object target, Errors errors) { UserController userController = (UserController) target; ValidationUtils.rejectIfEmptyOrWhitespace(errors, "code", null, "验证码必填"); ValidationUtils.rejectIfEmptyOrWhitespace(errors, "user.name", null, "用户名必填"); ValidationUtils.rejectIfEmpty(errors, "user.pass", null, "密码必填"); } }
3.动态工程的配置文件
a1.web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>SpringMVCDemo1_ivy</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- 配置SpringMVC拦截器(servlet) --> <servlet> <servlet-name>SpringMVC</servlet-name> <!-- 配置SpringMVC的前置拦截器,用于拦截匹配的请求 --> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 指定SpringMVC配置文件的路径 --> <init-param> <param-name>contextConfigLocation</param-name> <!-- 指定SpringMVC的配置文件.默认读取在/WEB-INF/目录下的以DispatcherServlet的servlet-name拼接-servlet.xml的文件 --> <!-- classpath前缀名字与servlet-name一致 --> <param-value>classpath:SpringMVC-servlet.xml</param-value> </init-param> <!-- 启动web容器时,加载servlet并初始化。数字越小,启动速度越快 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <!-- 指定需要拦截的URL地址。/:根路径下所有的文件 --> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
a2.验证 -- web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>SpringMVCDemo1_ivy</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- 配置Spring的监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 配置SpringMVC拦截器(servlet) --> <servlet> <servlet-name>SpringMVC</servlet-name> <!-- 配置SpringMVC的前置拦截器,用于拦截匹配的请求 --> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 指定SpringMVC配置文件的路径 --> <init-param> <param-name>contextConfigLocation</param-name> <!-- 指定SpringMVC的配置文件.默认读取在/WEB-INF/目录下的以DispatcherServlet的servlet-name拼接-servlet.xml的文件 --> <!-- classpath前缀名字与servlet-name一致 --> <param-value>classpath:SpringMVC-servlet.xml</param-value> </init-param> <!-- 启动web容器时,加载servlet并初始化。数字越小,启动速度越快 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <!-- 指定需要拦截的URL地址。/:根路径下所有的文件 --> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
4.SpringMVC的配置文件
a1.SimpleUrl映射 -- SpringMVC-servlet.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:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"> <!-- 配置SpringMVC url地址映射 --> <!-- 配置hanldelMapping指定以何种方式实现映射 --> <!-- 3.controller类中有多个方法:SimpleUrl映射 --> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/user/*">userController</prop> </props> </property> </bean> <!-- 配置指定的Controller --> <!-- login:UserController的方法 --> <!-- <bean name="/login" class="com.Elastic.SpringMVCDemo1.ivy.controller.UserController"></bean> --> <bean id="userController" name="/login" class="com.Elastic.SpringMVCDemo1.ivy.controller.UserController"></bean> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 视图解释的前缀名称 --> <!-- /:项目根目录。加在HelloController的逻辑视图名称。 --> <property name="prefix" value="/"></property> <!-- 视图解析的后缀名称 --> <property name="suffix" value=".jsp"></property> </bean> </beans>
5.Spring的配置文件
a.applicationContext.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> </beans>
6.jsp
a.login.jsp
<%--引入JSP页面PAGE指令 --%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%-- 引入JSTL标签指令 --%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html> <html language="zh-CN"> <head> <meta charset="utf-8"> <!-- 设置浏览器渲染的引擎 --> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <!-- 设置支持移动设备 --> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>网页标题</title> <!-- 引入bootstrap的样式 --> <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/bootstrap.min.css"> </head> <body> <div class="container"> <div class="panel panel-primary center-block"> <div class="panel-heading">登录</div> <div class="panel-body"> <form class="form-horizontal" action="user/login" method="post"> <div class="form-group"> <label class="col-md-3 control-label" for="loginName">用户名:</label> <div class="col-md-6" > <input class="form-control" id="loginName" name="name" type="text" autocomplete="off"/> </div> <div class="col-md-3"> </div> </div> <div class="form-group"> <label class="col-md-3 control-label" for="loginPass">密码:</label> <div class="col-md-6" > <input class="form-control" id="loginPass" name="pass" type="password"/> </div> <div class="col-md-3"> </div> </div> <div class="form-group"> <div class="col-md-offset-3 col-md-6"> <input class="btn btn-primary btn-block" type="submit" value="登录" /> </div> </div> </form> </div> </div> </div> <!-- 引入JS的样式 --> <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-2.2.4.js"></script> <script type="text/javascript" src="<%=request.getContextPath() %>/js/bootstrap.min.js"></script> </body> </html>
a2.调用两次bind()方法 -- login.jsp
<%--引入JSP页面PAGE指令 --%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%-- 引入JSTL标签指令 --%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html> <html language="zh-CN"> <head> <meta charset="utf-8"> <!-- 设置浏览器渲染的引擎 --> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <!-- 设置支持移动设备 --> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>网页标题</title> <!-- 引入bootstrap的样式 --> <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/bootstrap.min.css"> </head> <body> <div class="container"> <div class="panel panel-primary center-block"> <div class="panel-heading">登录</div> <div class="panel-body"> <form class="form-horizontal" action="user/login" method="post"> <div class="form-group"> <label class="col-md-3 control-label" for="loginName">用户名:</label> <div class="col-md-6" > <input class="form-control" id="loginName" name="name" type="text" autocomplete="off"/> </div> <div class="col-md-3"> </div> </div> <div class="form-group"> <label class="col-md-3 control-label" for="loginPass">密码:</label> <div class="col-md-6" > <input class="form-control" id="loginPass" name="pass" type="password"/> </div> <div class="col-md-3"> </div> </div> <div class="form-group"> <label class="col-md-3 control-label" for="code">验证码:</label> <div class="col-md-6" > <input class="form-control" id="code" name="code" type="text"/> </div> <div class="col-md-3"> </div> </div> <div class="form-group"> <div class="col-md-offset-3 col-md-6"> <input class="btn btn-primary btn-block" type="submit" value="登录" /> </div> </div> </form> </div> </div> </div> <!-- 引入JS的样式 --> <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-2.2.4.js"></script> <script type="text/javascript" src="<%=request.getContextPath() %>/js/bootstrap.min.js"></script> </body> </html>
a3.Spring标签 -- login.jsp
<%--引入JSP页面PAGE指令 --%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%-- 引入JSTL标签指令 --%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%-- 引入Spring标签指令 --%> <%@ taglib uri="http://www.springframework.org/tags/form" prefix="fm" %> <!DOCTYPE html> <html language="zh-CN"> <head> <meta charset="utf-8"> <!-- 设置浏览器渲染的引擎 --> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <!-- 设置支持移动设备 --> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>网页标题</title> <!-- 引入bootstrap的样式 --> <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/bootstrap.min.css"> </head> <body> <div class="container"> <div class="panel panel-primary center-block"> <div class="panel-heading">登录</div> <div class="panel-body"> <fm:form action="user/login" method="post"> <div class="form-group"> <label class="col-md-3 control-label" for="loginName">用户名:</label> <div class="col-md-6" > <input class="form-control" id="loginName" name="user.name" type="text" autocomplete="off"/> </div> <div class="col-md-3"> <fm:errors path="user.name"></fm:errors> </div> </div> <div class="form-group"> <label class="col-md-3 control-label" for="loginPass">密码:</label> <div class="col-md-6" > <input class="form-control" id="loginPass" name="user.pass" type="password"/> </div> <div class="col-md-3"> <fm:errors path="user.pass"></fm:errors> </div> </div> <div class="form-group"> <label class="col-md-3 control-label" for="code">验证码:</label> <div class="col-md-6" > <input class="form-control" id="code" name="code" type="text"/> </div> <div class="col-md-3"> <fm:errors path="code"></fm:errors> </div> </div> <div class="form-group"> <div class="col-md-offset-3 col-md-6"> <input class="btn btn-primary btn-block" type="submit" value="登录" /> </div> </div> </fm:form> </div> </div> </div> <!-- 引入JS的样式 --> <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-2.2.4.js"></script> <script type="text/javascript" src="<%=request.getContextPath() %>/js/bootstrap.min.js"></script> </body> </html>
b.reg.jsp
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>SpringMVCDemo1_ivy</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- 配置SpringMVC拦截器(servlet) --> <servlet> <servlet-name>SpringMVC</servlet-name> <!-- 配置SpringMVC的前置拦截器,用于拦截匹配的请求 --> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 指定SpringMVC配置文件的路径 --> <init-param> <param-name>contextConfigLocation</param-name> <!-- 指定SpringMVC的配置文件.默认读取在/WEB-INF/目录下的以DispatcherServlet的servlet-name拼接-servlet.xml的文件 --> <!-- classpath前缀名字与servlet-name一致 --> <param-value>classpath:SpringMVC-servlet.xml</param-value> </init-param> <!-- 启动web容器时,加载servlet并初始化。数字越小,启动速度越快 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <!-- 指定需要拦截的URL地址。/:根路径下所有的文件 --> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
相关文章推荐
- java基础知识
- 求同余幂
- java语言程序设计基础篇第九章编程练习题
- Java变量
- java访问修饰符
- struts2 学习路线
- Java注解——这些@圈圈都是个啥?
- 在Ubuntu 14.04 安装 JDK
- Java总结篇系列:Java多线程(三)
- struts2 插件使用
- Java phone,ip,idcard 获取地址信息
- Java中的Infinity和NaN
- JAVA基础类与对象实现模拟火车站购票功能
- Java总结篇系列:Java多线程(二)
- idea与eclipse的区别
- Java总结篇系列:Java多线程(一)
- spring4+mybatis3多数据源调用实例
- JAVA生成Excel及其下载
- JAVA多线程之Runnable和Thread比较
- debounce 防抖和 throttle 节流