1.Spring MVC的指示符:redirect:重定向 forward:转发
return “redirect:/user/login.html”;//url路径
return “frame”;//视图名
2.使用Servlet API对象作为入参:
以HttpServlertSession,对象作为入参取得页面的值:
控制层:annoController.java
public ModelAndView test(@RequestParam(value = "username",required = false) String uname,HttpSession session){
session.setAttribute("username","tom");
System.out.println(uname);
ModelAndView mv=new ModelAndView();
//跳转数据index与.jsp结合
mv.setViewName("index");
return mv;
}
页面:index.jsp
<h1>欢迎${username}hello,SpringMVC!</h1>
<h2>session:${sessionScope.username}</h2>
3.静态资源的引用:
我们通常会把css或js文件等等称为静态资源,静态资源在mvc中核心配置文件中注入:
<mvc:annotation-driven/>
<mvc:resources mapping="/statics/**" location="/statics/" />
mvc:resources/标签中
mapping:将静态资源映射到指定的路径下
location:本地静态资源文件所在的目录
4.异常处理,分为全局异常和局部异常,今天我们以RuntimeException为例。
<1>局部异常:在Controller中声明,仅能处理指定Controller中的异常
@ExceptionHandler
示例代码:
@ExceptionHandler(value={RuntimeException.class})
public String handlerException(RuntimeException e,HttpServletRequest req){
req.setAttribute("e", e);
return "login";
}
<1>全局异常:在mvc配置文件中,对所有异常进行统一处理
配置SimpleMappingExceptionResolver
发生异常时使用对应的视图报告异常
<!-- 全局异常处理 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.RuntimeException">login</prop>
</props>
</property>
</bean>
其中,java.lang.RuntimeException是我们自定义的异常,login是视图名。
5.@ModelAttribute的用法:
<1>应用到方法上:
@ModelAttribute("user1")
public User addUser(User user) {
return new User(1,"小明");
}
假设此方法是写在UserController内,那么执行UserController内带有@RequestMapping的方法之前,都会先执行此addUser方法.并且执行addUser过程中会添加两个对象到model,先将key为"user"的对象(由addUser方法的User user引起的),再添加key为"user1"的对象(由注解@ModelAttribute(“user1”)引起的).
<2>应用到方法的参数上:
@RequestMapping("/save")
public String save(@ModelAttribute User user) {
user.setUsername("丽华");
userService.save(user);
return "result";
}
此方法会先从model去获取key为"user"的对象,如果获取不到会通过反射实例化一个User对象,再从request里面拿值set到这个对象,然后把这个User对象添加到model(其中ke为"user").使用了@ModelAttribute可修改这个key,不一定是"user",此情况下,用与不用@ModelAttribute没有区别.
<3>同时应用到方法和方法的参数上:即上面两步的两个方法都添加UserController
@ModelAttribute("user1")
public User addUser(User user) {
return new User(1,"小明");
}
@RequestMapping("/save")
public String save(@ModelAttribute User user) {
user.setUsername("丽华");
userService.save(user);
return "result";
}
假设要执行保存用户操作,根据一分析可知,先执行完会产生两个User类型的对象(一个key是"user",另一个key是"user1")添加到model,再执行save方法,此时会先从model去找key为"user"的对象,能找到再从request取值set到这个User对象.最后返回到jsp页面,model里也只有两个User类型对象.再来个小小假设,将上面@ModelAttribute(“user1”)的user1改为user,其它不变.虽然执行了addUser方法,那么执行到save方法内,user对象的字段值还是来源于请求,最后返回到jsp页面,model里也只有一个User类型对象.
6.Spring表单标签:
Spring提供的轻量级标签库,可在JSP页面中渲染HTML元素的标签。
必须在JSP页面的开头处声明taglib指令
<%@ taglib prefix="form"
uri="http://www.springframework.org/tags/form" %>
<1>input标签相当于text(输入框组件)
<form:input path=“username”/>
<2>password标签(密码框组件)
<form:password path=“password”/>
<3>hidden标签(隐藏框组件)
<form:hidden path=“id”/>
<4>textarea标签是一个支持多行输入的html元素(多行输入框组件)
<form:textarea path=“remark” rows=“5” cols=“20”/>
<5>checkbox标签(复选框组件)
<form:checkbox path=“courses” value=“javaee” label=“javaee”/>
<form:checkbox path=“courses” value=“mybatis” label=“mybatis”/>
<6>checkboxes
<form:checkboxes items="${courseList}" path=“course”/>
<7>radiobutton标签(单选框组件)
<form:radiobutton path=“sex” value=“男”/>男
<8>radiobuttons标签
<form:radiobuttons path=“sex” items="${sexList}"/>
<9>select标签(下拉列表框组件)
<form:select path=“deptId”>
<form:option value=“1”>财务部</form:option>
</form:select>
<10>form标签(渲染表单元素)
<form:form action=“formTag/form.do” method=“post” commandName=“user”>
</from:from>