springmvc运行原理:客户端发送请求提交到DispatherServlet控制器,查询一个或多个HandlerMapping.找到处理请求的controller.DispatherServlet将请求提交到controller,controller调用业务逻辑处理后返回ModelAndView.DispatherServlet查询一个或多个viewResolver视图解析器,找到ModelAndView指定的视图,视图负责将结果显示到客户端。
web.xml
<!-- 配置Spring MVC的核心控制器DispatcherServlet -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name> 和dispatcherServlet-servlet.xml对应
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化参数 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/dispatcherServlet-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
自动启动servlet加载的优先级
负数 选择启动的时候才启动
</servlet><servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name> 和dispatcherServlet-servlet.xml对应
<url-pattern>/</url-pattern>不能写/*
</servlet-mapping>
配置文件默认WEB-INF下建的
<!--Spring默认的就是BeanNameUrlHandlerMapping -->//基本不用
<bean class=" org.springframework.web.servlet.BeanNameUrlHandlerMapping">//这句话要不要都行
通过bean的名称完成URL映射(访问的URL根目录)
<bean name=" url" class=" controller">
<!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
继承abstractController(不用写注解@controller)相当于struts2里action的execute 重写handleRequestInternal(request,response)方法
return new ModelAndView("welcome");//逻辑视图名 web-info里的页面是安全的不能访问到
<!--使用annotation方式,完成映射-->
<!--让spring扫描包下的所有的类,让标注spring注解的类都生效-->
加@controller
<context:component-scan base-package="cn.bdqn.controller"/>
<mvc:annotation-driven/>
<!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
基于注解DefaultAnnotationHandlerMapping让spring扫描包下的所有类,让标注spring注解的类生效
通过RequestMapping映射 @RequestMapping(value="")
HandlerMapping两种实现
BeaningNameUrlHandlerMapping根据控制器Bean的名字将控制器映射到URL
DefalutAnnotationHandlerMapping将请求映射给使用@RequestMapping注解的控制器和控制方法
视图解析器:将逻辑视图的名字与JSP等视图技术进行匹配InternalResourceViewResovler
在Web应用程序的WAR文件中查找视图模板,视图模板的路径根据加完前缀和后缀的逻辑视图名称来确定
prefix subffix
(@requestParam(value="username",required=true(默认值)) String username) 直接通过函数参数传值
支持Rest风格会把参数当做URL地址的一部分(required=false)
(@requestParam(value="username")前端参数名和后台参数名一致可省略,不用写@requestparam 是地址?后的参数 和前台请求参数
model.addAttribute("username",username); map键值对结构
model.addAttribute(username)前台取key值username类型“string” 或“user”对象
return返回字符串view视图名
也可以用注解@ModelAttribute("user");user是key值
//springmvc对象入参,如果没有用addAttibute或注解会自动放到model中去key的名字为对象名(user)
前提是:从来没有往model里放数据
mview.setViewName("/");return modelandview 返回modelandview
mview.addObject("username",username);String类型
mview.addObject(username);前台取key值username类型“string” 或“user”对象${string}${username}小写
入参两种Map(不推荐)和Model(作用域request 多线程)同一张hash表 索引改变
struts2的action多例的 scope="prototype"
springMvc里的controller是单例的(高并发的情况下方法间的入参传递参数性能高)
<c:out value="${}">jstl el表达式
rest风格并不等于rest技术 表述性状态转移
method=RequestMethod.
get 请求读取数据
post请求添加提交
delete请求删除
put请求修改
不同的请求对应不同的关系 一个资源可以对应多种视图
return "redirect/forward:url" 返回的是url不是逻辑视图名
@requestMapping具有唯一性(参数要不一样value,method,param)
controller是单例的
JSR303验证框架服务器端验证
Jboss.jar
Hibernate-Validator.jar
validation-api.jar
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;
public class User {
private int id;
private String userName;
private String password;
private String email;
public User() {
}
public User(int id, String userName, String password, String email) {
this.id = id;
this.userName = userName;
this.password = password;
this.email = email;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@NotEmpty(message="用户名不能为空")
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Size(max=4,min=10,message="密码长度必须在4-10之间")
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Email(message="邮箱格式不正确")
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User [id=" + id + ", userName=" + userName + ", password="
+ password + ", email=" + email + "]";
}
}
@Controller
public class UserLogin{
private Map<String,User> map = new HashMap<String,User>();
public UserLogin() {
map.put("1",new User(1,"beta01","admin","beta@qq.com"));
map.put("2",new User(2,"beta02","admin","beta@qq.com"));
map.put("3",new User(3,"beta03","admin","beta@qq.com"));
}
@RequestMapping(value="/addsave",method=RequestMethod.POST)
public String addSave(@Validated User user,BindingResult bindingResult){//紧跟validate之后写验证结果
if(bindingResult.hasErrors()){
return "user/add";
}
map.put(user.getId()+"",user);
return "redirect:/user/list";
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="fm"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!--不指定action 提交到/add -->
<fm:form modelAttribute="user" action="addsave" method="post">
ID:<fm:input path="id"/>
userName:<fm:input path="username"/> <fm:errors path="username"/>
password:<fm:input path="password"/> <fm:errors path="password"/>
email:<fm:input path="email"/> <fm:errors path="email"/>
<input type="submit" value="提交"/>
</fm:form>
</body>
</html>
rest风格 ?id=123 @requestParam String id 取问号后的参数
//rest风格 @PathVariable 取地址里的参数
//rest风格 取地址里的参数
@RequestMapping(value="/view/{id}",method=RequestMethod.GET)
public String view(@PathVariable String id,Model model){
model.addAttribute(map.get(id));
return "user/view";
}
server.xml
URIEncoding="urf-8"
useBodyEncodingForURI="TRUE"
<!--处理字符编码的filter-->
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>