目录
什么是MVC
MVC (Model-View-Controller):
Model:组件等价于 实体层 + 业务逻辑层 + 持久层
View(视图):负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
Controller(控制器):接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图。
导入包
一些常用的包
<!--springmvc支持的包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.2.0.RELEASE</version>
</dependency>
<!--xml部分节点不识别问题-->
<dependency>
<groupId>xerces</groupId>
<artifactId>xmlParserAPIs</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>xerces</groupId>
<artifactId>xerces</artifactId>
<version>2.4.0</version>
</dependency>
<!--jackson一种json相关的包,可以更方便地在前后端传递对象-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.2.1</version>
</dependency>
构建
首先建立Service层,Dao层,jsp页面和从前一样
SpringMVC.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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--<bean id="/zs" class="zs.controller.UserController" autowire="byType"></bean>-->
<!--注解配置的包-->
<context:component-scan base-package="zs.controller"/>
<!--开启mvc注解配置-->
<mvc:annotation-driven/>
<!--开启springaop注解配置-->
<aop:aspectj-autoproxy/>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀、后缀-->
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--静态资源默认控制-->
<mvc:default-servlet-handler/>
</beans>
Web.xml
<servlet>
<servlet-name>SpringMvc</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>SpringMvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Controller.java
传统的web编程是用servlet控制的,这里替换成Controller,@RequestMapping就相当于servlet指定的地址,可以直接访问。
参数名与表单名一致,则会自动匹配,接受前端的值,十分方便。
return默认是转发,写地址。
@ResponseBody是标记方法为响应体,return的对象直接写到页面上,前面导入jackson后自动变为json串让页面识别,一般用作异步请求。
@Controller
public class UserController {
@Autowired
UserService service;
@RequestMapping("/index")
@ResponseBody
public String getpages(String name, Integer sex){
return "你好";
}
@RequestMapping("/user")
public String getuser(User user,String username){
return "index.jsp";
}
}
如果user对象中有一个变量名是name,参数name也可以找到。
参配置
@RequestMapping("/user2")
@ResponseBody
//required=true没传参就报错,反之username=null不一定报错,前提没有默认值
public String getuser2(@RequestParam(value = "name",required = true,defaultValue = "zhangshuo")String username){
System.out.println(username);
return username;
}
RESTful
页面访问是参数可以是斜杠拼在后面,优点是安全和方便,用户不知道变量名,拼接时不用打一长串
@RequestMapping("/user/{name}/{password}")
@ResponseBody
public String user(@PathVariable("name") String name, @PathVariable("password")String password){
return name+" "+password;
}
重定向
控制器之间访问时不能通过转发的,因为转发并不是一个完整请求过程,不能经过控制器。
@RequestMapping("/user3")
public String getuser3(Date date){
System.out.println(date);
return "redirect:user4";
}
@RequestMapping("/user4")
public String getuser4(){
return "redirect:user5";
}
@RequestMapping("/user5")
@ResponseBody
public String getuser5(){
return "success";
}
时间格式
默认时间格式只有一种斜杠分割,需要根据喜好编辑格式
public class DateEditor extends PropertiesEditor{
@Override
public void setAsText(String text) throws IllegalArgumentException {
SimpleDateFormat sdf=null;
if(Pattern.matches("\\d{4}-\\d{2}-\\d{2}",text)){
sdf=new SimpleDateFormat("yyyy-MM-dd");
}else if(Pattern.matches("\\d{4}/\\d{2}/\\d{2}",text)){
sdf=new SimpleDateFormat("yyyy/MM/dd");
}else if(Pattern.matches("\\d{4}年\\d{2}月\\d{2}日",text)){
sdf=new SimpleDateFormat("yyyy年MM月dd日");
}else{
try {
throw new Exception("日期类型不正确!");
} catch (Exception e) {
e.printStackTrace();
}
}
try {
setValue(sdf.parse(text));
} catch (ParseException e) {
e.printStackTrace();
}
}
}
在控制器中调用,实现时间类型格式的绑定
@InitBinder
public void getDate(WebDataBinder wb){
wb.registerCustomEditor(Date.class,new DateEditor());
}
注解配置MVC
@Configuration
@EnableWebMvc
@ComponentScan("zs.controller")
public class MVCConfig extends WebMvcConfigurerAdapter{
//配置视图解析器
@Bean
public InternalResourceViewResolver internalResourceViewResolver(PropertyConfig pc){
InternalResourceViewResolver viewResolver=new InternalResourceViewResolver();
viewResolver.setPrefix(pc.getPrefix());
viewResolver.setSuffix(pc.getSuffix());
return viewResolver;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}