Spring MVC
1.结构最清晰的MVC Model2实现
2.Controller
3.ModelAndView
1.HTTP请求 SpringMVC核心是前端控制器DispatcherServlet 在web.xml <servlet-name>-servlet.xml配置 html
2.HandlerMapping:经过配置去找Handler(Controller)前端
3.Handler:处理器 调用service方法进行业务处理git
4.返回数据ModelAndView(增删改查)逻辑视图名 并非真正的视图对象web
5.ViewResolver :视图解析器 DispatcherServlet借助视图解析器把逻辑视图名解析成真正的视图对象。正则表达式
6.得到model数据模型放到View视图中(JSP/JSTL/PDF...)spring
7.HTTP响应给客户端(用户)mvc
springMVC在web.xml配置
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup><!--优先启动 -->
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
springMVC-servlet.xml核心配置文件/WEB-INF/springMVC-servlet.xml
<!-- 经过bean的name,完成url映射 -->
<bean name="/springMVC.html" class="cn.bdqn.controller.HelloController"/>
name是用户请求的url 经过class找到controller controller返回modelandwiew 经过视图解析器解析返回view视图给用户。
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
我要放到resource里面 在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:springMVC-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup><!--优先启动 -->
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
注解的方式:DefaultAnnotationHandlerMapping
<!--使用annotation方式,完成映射-->
<!--使用annotation方式,完成映射-->
<!--让spring扫描包下的全部的类,让标注spring注解的类生效 -->
<context:component-scan base-package="cn.bdqn.controller"></context:component-scan>
<mvc:annotation-driven/>
经过@RequestMapping(value = "/hello")
经过@RequestMapping的value匹配用户请求的url找到controller类的xxx方法 再执行
@Controller
public class WelcomController {
// 经过@RequestMapping的value匹配用户请求的url找到controller类的hello()方法 再执行
@RequestMapping(value = "/hello")
public String hello() {
System.out.println("hello spring!!!");
return "hello";// 逻辑视图名
}
}
视图解析器:
1.将逻辑视图的名字与JSP等视图技术进行匹配
2.InternalResourceViewResolver
在web应用程序的War文件中查找视图模板,视图模板的路径根据加完前缀和后缀的逻辑视图名称来肯定
prefix
suffix
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
参数的传递-1
1.@RequestParam
2.直接经过函数参数传值
@RequestMapping(value = "/hello")
public String hello(@RequestParam(value = "username") String username) {
System.out.println("hello spring!!! username----->>>" + username);
return "hello01";// 逻辑视图名
}
@RequestParam(value = "username")请求中的参数必须写
@RequestMapping(value = "/hello")
public String hello(String name) {
System.out.println("hello spring!!! name----->>>" + name);
return "hello01";// 逻辑视图名
}
经过url传来的参数 在后台直接能取到。可是参数名必须与方法传递的参数名一致 不然获取不到
@RequestMapping(value = "/hello")
// 经过model.addAttribute("username",name)放进做用域。经过EL表达式取出数据
public String hello(String name, Model model) {
model.addAttribute("username", name);
System.out.println("hello spring!!! name----->>>" + name);
return "hello01";// 逻辑视图名
}
@RequestMapping(value = "/hello")
// 经过model.addAttribute("username",name)放进做用域。经过EL表达式取出数据
public ModelAndView hello(String name) {
System.out.println(name);
ModelAndView model = new ModelAndView();
model.setViewName("hello01");// 逻辑 视图名
model.addObject("username", name);
return model;
}
@RequestMapping(value = "/hello")
// 经过model.addAttribute("username",name)放进做用域。经过EL表达式取出数据
public ModelAndView hello(String name) {
System.out.println(name);
ModelAndView model = new ModelAndView();
model.setViewName("hello01");// 逻辑 视图名
model.addObject(name);// 在前台取值${string} 就是取到value的数据类型
return model;
}
@RequestMapping(value = "/hello")
// 经过model.addAttribute("username",name)放进做用域。经过EL表达式取出数据
public String hello(String name, Map<String, Object> model) {
System.out.println(name);
model.put("name", name);// 在前台取值${string} 就是取到value的数据类型
return "hello01";
}
参数的传递-2
经过Map<Spring,Object>
Model
controller是单例的。
REST风格 并非rest技术
1.Representational State Transfer表达性状态转移
2.传统的查、改、删的URL与REST风格的增删改URL对比
/userview.action?id=12 VS /user/12
/userdelete.action?id=12 vs /user/12/delete
/userdelete.action?id=12 vs /user/12/update
3.请求方式
GET 读取数据 查询
POST 添加 提交
DELETE 删除
PUT 修改
他强调的是一个资源能够对应多种视图
建立POJO-User类
HashMap
@RequestMapping(value="/userlist",method=RequestMethod.GET)
@Controller
@RequestMapping(value = "/user")
public class UserController {app
private static Map<String, Object> map = new HashMap<String, Object>();jsp
// 经过静态代码块赋值
static {
map.put("1", new User(1, "张三", "123456", "bdan@123.com"));
map.put("2", new User(2, "李四", "123456", "bdan@456.com"));
map.put("3", new User(3, "王五", "123456", "bdan@789.com"));
}函数
@RequestMapping(value = "/list",method = RequestMethod.GET)
public String list(Model model) {
model.addAttribute("map", map);
return "user/userlist";
}
}
用户列表:<br>
<c:forEach var="ul" items="${map }">
id:${ul.value.id }------
userName:${ul.value.userName }------
password:${ul.value.password }------
email:${ul.value.email }<br>
</c:forEach>
@RequestMapping(value = "/list",method = RequestMethod.GET)
public String userList(HttpServletRequest request) {
List<User> list = new ArrayList<User>();
list.add(new User(1, "张三", "123456", "bdan@123.com"));
list.add(new User(2, "李四", "123456", "bdan@456.com"));
list.add(new User(3, "王五", "123456", "bdan@789.com"));
request.setAttribute("list", list);
return "user/userlist";
}
用户列表:<br>
<c:forEach var="user" items="${list }">
id:${user.id }------
userName:${user.userName }------
password:${user.password }------
email:${user.email }<br>
</c:forEach>
model的做用域是个request级别
异常处理
JSR303 是一套JavaBean参数校验的标准,它定义了不少经常使用的校验注解,咱们能够直接将这些注解加在咱们JavaBean的属性上面,就能够在须要校验的时候进行校验了。注解以下:
@NotNull 注解元素必须是非空
@Null 注解元素必须是空
@Digits 验证数字构成是否合法
@Future 验证是否在当前系统时间以后
@Past 验证是否在当前系统时间以前
@Max 验证值是否小于等于最大指定整数值
@Min 验证值是否大于等于最小指定整数值
@Pattern 验证字符串是否匹配指定的正则表达式
@Size 验证元素大小是否在指定范围内
@DecimalMax 验证值是否小于等于最大指定小数值
@DecimalMin 验证值是否大于等于最小指定小数值
@AssertTrue 被注释的元素必须为true
@AssertFalse 被注释的元素必须为false
Hibernate validator 在JSR303的基础上对校验注解进行了扩展,扩展注解以下:
@Email 被注释的元素必须是电子邮箱地址
@Length 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range 被注释的元素必须在合适的范围内
<!-- 处理字符编码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>
@RequestMapping(value = "/addSave", method = RequestMethod.POST)
public String addSave(@Validated User user, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "user/add";// 若是用户输入不正确 就会返回add 从新输入
}
map.put(user.getId() + "", user);
return "redirect:/user/list";
}
/**
* REST风格
* @param id
* @param model
* @return
*/
@RequestMapping(value = "/view/{id}", method = RequestMethod.GET)
public String view(@PathVariable String id, Model model) {
System.out.println(id);
model.addAttribute("user", map.get(id));
return "user/view";
}
/**
* 先回显 在修改
* @param id
* @param user
* @return
*/
@RequestMapping(value = "/{id}/update", method = RequestMethod.GET)
public String update(@PathVariable String id, Model model) {
model.addAttribute(map.get(id));
return "user/update";
}
/**
* 修改@PathVariable REST风格获取参数 {id}入参的形式
* @param id
* @param user
* @param bindingResult
* @return
*/
@RequestMapping(value = "/{id}/update", method = RequestMethod.POST)
public String update(@PathVariable String id, @Validated User user,
BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "user/update";
}
map.put(user.getId() + "", user);
return "redirect:/user/list";
}
@RequestMapping(value = "/{id}/delete", method = RequestMethod.GET) public String detele(@PathVariable String id) { map.remove(id);// 删除 return "redirect:/user/list"; } 1.异常处理 1.局部异常处理:@ExceptionHandler 2.全局异常处理:SimpleMappingExceptionResolver 2.使用Servlet API对象做为入参 1.HttpSession 2.HttpServletRequest 3.HttpServletResponse map<key,value> hash表的结构 1 map<object,object> map key="t01" value的内存地址