SpringMVC注解方式
要点:
基于xml文件配置的mvc的缺点:到项目到达一定程序时,就会有很多的配置文件,造成项目维护起来比较麻烦,优点:低侵入式,降低了耦合。
注解:
@Controller:将一个类标记为控制器
@RequestMapping:可以修饰两种类型,修饰方法时表示:将请求映射到对应的方法;修饰类时表示:类的映射路径,相当于定义了一个相对的路径,在地址栏中访问时就要加个修饰了,例如:在类中修饰了一个@RequestMapping("/jsp"),那么在地址栏中就是:http://localhost:SpringMVC07/jsp/toLogin.do。
value属性:只做修饰的时候,可以不用写value,例如:@RequestMapping("/jsp"),这样写和@RequestMapping(value="/jsp")是一样的。
method属性:表示请求的方式,例如:@RequestMapping(value="/toLogin_get" ,method=RequestMethod.GET),表示以GET方式请求,method=RequestMethod.POST表示以POST方式请求。
@PathVariable:restful风格,路径变量,在方法上面定义一个:@RequestMapping("/toUrlLogin/{name} "),然后方法的参数定义为:toUrlLogin(@PathVariable String name),其中name就是路径变量,当访问地址是:http://localhost:8080/SpringMVC07/jsp/toUrlLogin/zhangsan.do,会将zhangsan取出来放在name变量中,还可以支持多个变量:@RequestMapping("/toUrlLogin/{name} /{age}/{sex}");注:java编译分为两种,dubug、release,如果是选择release编译,将原来:toUrlLogin(@PathVariable String name),写成toUrlLogin(@PathVariable("name") String name)。
@RequestParam:request参数,例如:@RequestParam String password,使用注解方式避免了使用request.getParameter("password")方式来取,参数的类型根据属性编辑器开决定。
@CookieValue:从请求中获得CoolieValue。
@RequestHeader:从请求中获得请求头部的信息。
@InitBinder:数据绑定,将一个方法设置成数据绑定方法;例如:public void initBinder(WebRequestDataBinder binder)。
方法的参数:参数可以是0到多个
HttpServletRequest、HttpServletResponse、HttpSession、@PathVariable、@RequestParam、任意对象。
方法的返回值类型:
void、String、ModelAndView、Model、Map、任意对象类型。(Model类型其实就是对Map类型的封装)
操作:
1.新建一个名为 :SpringMVC07 的项目,并把配置spring mvc需要的Jar都加到WEB-INF/lib目录下。
2.在项目中建两个源包,src/java , src/config ,源包在编译之后,都会跑到Tomcat相应的应用目录下的WEB-INF/classes目录下。
3.在config源包中建一个spring包,并在spring包中建一个servlet.xml,配置servlet.xml,如果要使用基于注解的spring mvc ,则在配置文件中必须加入一个 context 与 mvc 的命名空间,分别为: xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
4.controller类可以不定义requestMapping,但一个要请求路径的方法,就必须定义requestMapping。
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 配置DispatcherServlet -->
<servlet>
<!-- servlet配置 -->
<servlet-name>commServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化参数 -->
<init-param>
<!-- 手动配置配置文件 -->
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/spring/*.xml</param-value>
</init-param>
<!-- 项目启动时加载 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- servlet映射 -->
<servlet-mapping>
<servlet-name>commServlet</servlet-name>
<!-- 所有.do结尾的请求都由commServlet管理 -->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
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:p="http://www.springframework.org/schema/p"
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-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 主键扫描,配置要扫描的Java类 -->
<context:component-scan base-package="com.cjh.action"/>
<!-- 定义一个视图解析类,基于ResourceView的解析器 ,此解析器是在url解析器上,加入了对jstl的支持-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
LoginAction类:
package com.cjh.action;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.cjh.model.User;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@Controller //标记这个类为控制器
@RequestMapping("/jsp") //类的映射路径
public class LoginAction {
/**
* toLogin映射到toLogin()方法
* @return
*/
@RequestMapping("/toLogin") //映射到toLogin方法
public String toLogin(){
return "login";
}
/**
* debug编译时写成@PathVariable String name
* @param name
* @return
*/
@RequestMapping("/toUrlLogin/{name}") //name为url模板中取出的路径变量
public String toUrlLogin(@PathVariable String name){ //路径变量
System.out.println(name);
return "login";
}
/**
* release编译的时候@PathVariable("name")要写这样
* @param name
* @return
*/
@RequestMapping("/toUrlLogin2/{name}") //name为url模板中取出的路径变量
public String toUrlLogin2(@PathVariable("name") String name){ //路径变量
System.out.println(name);
return "login";
}
/**
* 以Get方式请求时,并且请求的url是toLogin_get的
* @return
*/
@RequestMapping(value="/toLogin_get" ,method=RequestMethod.GET)//请求为GET方式时
public String toLogin_get(){
System.out.println("RequestMethod.GET");
return "login";
}
/**
* 以POST方式请求时,并且请求的url是toLogin_post的
* @return
*/
@RequestMapping(value="/toLogin_post" , method=RequestMethod.POST)//请求为POST方式时
public String toLogin_post(){
System.out.println("RequestMethod.POST");
return "login";
}
/**
* 将请求中的字符日期转换成Date
* @param date
*/
@RequestMapping(value="/toDate/{d}", method=RequestMethod.GET)
public void toDate(@PathVariable("d") Date date){
System.out.println(date);
}
/**
* 参数可以是很多种
* @param request
* @param response
* @param session
*/
public void toAllArgs(HttpServletRequest request,HttpServletResponse response,
HttpSession session,@PathVariable("name") String name,@RequestParam String password){
}
/**
* 使用@RequestParam获得参数
* @param name
*/
@RequestMapping("/toRequestParam")
public void toRequestParam(@RequestParam String name){
System.out.println(name);
}
/**
* 使用@RequestParam并且是Get方式获得参数
*/
@RequestMapping(value="/toRequestParamGet" , method=RequestMethod.GET)
public void toRequestParamGet(@RequestParam String name,@RequestParam String password){
System.out.println(name);
System.out.println(password);
}
/**
* 参数是一个Map的
* @param model
* @return
*/
@RequestMapping("toMap")
public String toMap(Map model){
model.put("a", "b");
return "login";
}
/**
* 将表单数据封装成实体对象传入
* @param user
* @return
*/
@RequestMapping("/toUser")
public String toUser(User user){
return "login";
}
/**
* 数据绑定
* @param binder
*/
@InitBinder
public void initBinder(ServletRequestDataBinder binder){
//registerCustomEditor方法的第一个参数为要转换类型的class,第二个参数为属性编辑器
//CustomDateEditor属性编辑器类的构造方法的第一个参数为格式,第二个参数为是否可以为空
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true));
}
}
要点:
基于xml文件配置的mvc的缺点:到项目到达一定程序时,就会有很多的配置文件,造成项目维护起来比较麻烦,优点:低侵入式,降低了耦合。
注解:
@Controller:将一个类标记为控制器
@RequestMapping:可以修饰两种类型,修饰方法时表示:将请求映射到对应的方法;修饰类时表示:类的映射路径,相当于定义了一个相对的路径,在地址栏中访问时就要加个修饰了,例如:在类中修饰了一个@RequestMapping("/jsp"),那么在地址栏中就是:http://localhost:SpringMVC07/jsp/toLogin.do。
value属性:只做修饰的时候,可以不用写value,例如:@RequestMapping("/jsp"),这样写和@RequestMapping(value="/jsp")是一样的。
method属性:表示请求的方式,例如:@RequestMapping(value="/toLogin_get" ,method=RequestMethod.GET),表示以GET方式请求,method=RequestMethod.POST表示以POST方式请求。
@PathVariable:restful风格,路径变量,在方法上面定义一个:@RequestMapping("/toUrlLogin/{name} "),然后方法的参数定义为:toUrlLogin(@PathVariable String name),其中name就是路径变量,当访问地址是:http://localhost:8080/SpringMVC07/jsp/toUrlLogin/zhangsan.do,会将zhangsan取出来放在name变量中,还可以支持多个变量:@RequestMapping("/toUrlLogin/{name} /{age}/{sex}");注:java编译分为两种,dubug、release,如果是选择release编译,将原来:toUrlLogin(@PathVariable String name),写成toUrlLogin(@PathVariable("name") String name)。
@RequestParam:request参数,例如:@RequestParam String password,使用注解方式避免了使用request.getParameter("password")方式来取,参数的类型根据属性编辑器开决定。
@CookieValue:从请求中获得CoolieValue。
@RequestHeader:从请求中获得请求头部的信息。
@InitBinder:数据绑定,将一个方法设置成数据绑定方法;例如:public void initBinder(WebRequestDataBinder binder)。
方法的参数:参数可以是0到多个
HttpServletRequest、HttpServletResponse、HttpSession、@PathVariable、@RequestParam、任意对象。
方法的返回值类型:
void、String、ModelAndView、Model、Map、任意对象类型。(Model类型其实就是对Map类型的封装)
操作:
1.新建一个名为 :SpringMVC07 的项目,并把配置spring mvc需要的Jar都加到WEB-INF/lib目录下。
2.在项目中建两个源包,src/java , src/config ,源包在编译之后,都会跑到Tomcat相应的应用目录下的WEB-INF/classes目录下。
3.在config源包中建一个spring包,并在spring包中建一个servlet.xml,配置servlet.xml,如果要使用基于注解的spring mvc ,则在配置文件中必须加入一个 context 与 mvc 的命名空间,分别为: xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
4.controller类可以不定义requestMapping,但一个要请求路径的方法,就必须定义requestMapping。
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 配置DispatcherServlet -->
<servlet>
<!-- servlet配置 -->
<servlet-name>commServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化参数 -->
<init-param>
<!-- 手动配置配置文件 -->
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/spring/*.xml</param-value>
</init-param>
<!-- 项目启动时加载 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- servlet映射 -->
<servlet-mapping>
<servlet-name>commServlet</servlet-name>
<!-- 所有.do结尾的请求都由commServlet管理 -->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
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:p="http://www.springframework.org/schema/p"
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-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 主键扫描,配置要扫描的Java类 -->
<context:component-scan base-package="com.cjh.action"/>
<!-- 定义一个视图解析类,基于ResourceView的解析器 ,此解析器是在url解析器上,加入了对jstl的支持-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
LoginAction类:
package com.cjh.action;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.cjh.model.User;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@Controller //标记这个类为控制器
@RequestMapping("/jsp") //类的映射路径
public class LoginAction {
/**
* toLogin映射到toLogin()方法
* @return
*/
@RequestMapping("/toLogin") //映射到toLogin方法
public String toLogin(){
return "login";
}
/**
* debug编译时写成@PathVariable String name
* @param name
* @return
*/
@RequestMapping("/toUrlLogin/{name}") //name为url模板中取出的路径变量
public String toUrlLogin(@PathVariable String name){ //路径变量
System.out.println(name);
return "login";
}
/**
* release编译的时候@PathVariable("name")要写这样
* @param name
* @return
*/
@RequestMapping("/toUrlLogin2/{name}") //name为url模板中取出的路径变量
public String toUrlLogin2(@PathVariable("name") String name){ //路径变量
System.out.println(name);
return "login";
}
/**
* 以Get方式请求时,并且请求的url是toLogin_get的
* @return
*/
@RequestMapping(value="/toLogin_get" ,method=RequestMethod.GET)//请求为GET方式时
public String toLogin_get(){
System.out.println("RequestMethod.GET");
return "login";
}
/**
* 以POST方式请求时,并且请求的url是toLogin_post的
* @return
*/
@RequestMapping(value="/toLogin_post" , method=RequestMethod.POST)//请求为POST方式时
public String toLogin_post(){
System.out.println("RequestMethod.POST");
return "login";
}
/**
* 将请求中的字符日期转换成Date
* @param date
*/
@RequestMapping(value="/toDate/{d}", method=RequestMethod.GET)
public void toDate(@PathVariable("d") Date date){
System.out.println(date);
}
/**
* 参数可以是很多种
* @param request
* @param response
* @param session
*/
public void toAllArgs(HttpServletRequest request,HttpServletResponse response,
HttpSession session,@PathVariable("name") String name,@RequestParam String password){
}
/**
* 使用@RequestParam获得参数
* @param name
*/
@RequestMapping("/toRequestParam")
public void toRequestParam(@RequestParam String name){
System.out.println(name);
}
/**
* 使用@RequestParam并且是Get方式获得参数
*/
@RequestMapping(value="/toRequestParamGet" , method=RequestMethod.GET)
public void toRequestParamGet(@RequestParam String name,@RequestParam String password){
System.out.println(name);
System.out.println(password);
}
/**
* 参数是一个Map的
* @param model
* @return
*/
@RequestMapping("toMap")
public String toMap(Map model){
model.put("a", "b");
return "login";
}
/**
* 将表单数据封装成实体对象传入
* @param user
* @return
*/
@RequestMapping("/toUser")
public String toUser(User user){
return "login";
}
/**
* 数据绑定
* @param binder
*/
@InitBinder
public void initBinder(ServletRequestDataBinder binder){
//registerCustomEditor方法的第一个参数为要转换类型的class,第二个参数为属性编辑器
//CustomDateEditor属性编辑器类的构造方法的第一个参数为格式,第二个参数为是否可以为空
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true));
}
}