注解模式示例:配置文件:
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd ">
<!-- 注解驱动:声明使用注解的方式。 -->
<mvc:annotation-driven/>
<!-- 类扫描机制,定义扫描的范围 -->
<context:component-scan base-package="cn.itcast.springmvc.web.controller"></context:component-scan>
<!-- 内部资源视图解析器 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀 , value中设置值,设置为/时默认是从根目录开始寻找-->
<property name="prefix" value="/"></property>
<!--后缀 -->
<property name="suffix" value= ".jsp"></property>
</bean>
</beans>
配置好了之后书写Controller类:
package cn.itcast.springmvc.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HomeController {
//此注解用于标注访问的时的uri,当配置为/时,必须在工程名后跟.action即什么都输入,只输入.action,这样拦截机制才会起作用。
@RequestMapping(value = { "/", "/home.action" })
public String goHome() {
System.out.println("Brave new world!");
return "index";
}
}
通过上面的例子可以得出以下内容,书写的类型与struts2基本相似,学习过struts2后使用此方法很方便, 但是在该方法内没有看到参数,
也没有返回ModelandView吗?事实上不是这样的,在goHome方法中,当需要时,可以将你需要的参数放入到方法的参数内,即括号中,
springMVC会自动帮你将将相应的参数传入,只是上例没有而已。当需要request的时候写上request,当需要页面传递进来的beanid时写上beanID即可。
示例:第一种将数据返回给页面的方法
cn.itcast.springmvc.controller. PersonController 控制类
@Controller
public class PersonController {
@Resource
private PersonService ps;
@RequestMapping(value={"/person/list"})
//需要在页面回显数据时,直接新建一个map, 参数名为model,将要显示的数据放入到该model中即可。
public String list(Map<String,Object> model){ //BindingAwareModelMap
System.out.println("all");
List<Person> list = ps.list();
model.put("personList", list);
return “jPersonList";
}
}
示例:第二种将数据返回给页面的方法:
cn.itcast.springmvc.controller. PersonController 控制类
@Controller
public class PersonController {
@Resource
private PersonService ps;
@RequestMapping(value={"/person/list"})
//这里需要注意的model在addAttribute时,并没有指定参数的key值,所以在页面中应该如何的取出呢?
//springMVC默认的处理机制是,当存入的参数是一个容器的时候,容器中存放的是持久化类,然后根据
//持久化类的类名转小写,然后拼接上一个list,在页面中:${personList.id}即可调用。
public String list(Model model){ //BindingAwareModelMap
System.out.println("all");
List<Person> list = ps.list();
model.addAttribute("personList", list);
return “jPersonList";
}
}
无论上面两个那种方法,都是继承了BindingAwareModelMap,采用其中的机制。
当使用return "redirect:/person/list.action"; 相当于就是重定向到了另一个 action方法。
在类上注解使用 @RequestMapping(value={"/person"}),则在下面的方法中无需在重复的输入/person,springMVC会自动负责拼装。
在实际的业务中,为了区分,通常将配置bean的文件与配置Controller的配置文件分开,这样的话则需要在web.xml中重新配置,配置方法如下:
在web.xml中增加配置:
<!-- 通过上下文参数指定分解的上下文配置参数 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:beans.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
当做增删改查操作时,如果传的参数和PO对象字段不同呢?怎么做?
解决方案:public String delete(@RequestParam("delId") Integer id)其中的requestparam(“delid”)就是页面上的字段名称,
当在参数中使用此标签时,springMVC会自动进行相互转换。也就是说注解也是可以写在参数中的^ ^.
springMVC实现文件上传示例:
配置文件上传解析器等:
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd ">
<!-- 注解驱动方式 -->
<mvc:annotation-driven/>
<!-- 自动扫描 -->
<context:component-scan base-package="cn.itcast.springmvc.web.controller"/>
<!-- 静态资源进行管理 -->
<mvc:resources location="/resources/" mapping="/resources/**"/>
<mvc:resources location="/upload/" mapping="/upload/**"/>
<!-- 文件上传解析器 上传最大尺寸:10M(10485760)、id名称必须为:multipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"/>
</bean>
<!-- 内部资源视图解析器 (前缀+逻辑名+后缀) -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsps/"/>
<!-- 后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
java代码:
@RequestMapping("/saveOrUpdate.action")
public String saveOrUpdate(
@Valid Person p, BindingResult br,
MultipartFile photo,
HttpServletRequest request
) throws IOException{
/**
* 步骤:
* 1、得到文件
* 2、保存文件到服务上
* 3、设置记录对应的图片位置
*/
//校验出错
if(br.hasErrors()){
if(p.getId()==null){
return "person/jPersonCreate";
}else{
return "person/jPersonUpdate";
}
}
if(!photo.isEmpty()){
ServletContext sc = request.getSession().getServletContext();
String dir = sc.getRealPath("/upload/"); //得到服务器真实路径
String filename = photo.getOriginalFilename(); //得到上传时的文件名
String _extName = filename.substring(filename.indexOf(".")); //扩展名
// filename = UUID.randomUUID().toString() + _extName; //图片名称定义为UUID,防止并发文件被覆盖的情况
// filename = System.nanoTime() + _extName; //nanoTime数值
filename = System.currentTimeMillis() + _extName; //currentTimeMillis数值
FileUtils.writeByteArrayToFile(new File(dir+"/"+filename), photo.getBytes()); //写文件到服务器上
p.setPhotoPath("/upload/" + filename); //设置图片路径
}
personService.saveOrUpdate(p);
return "redirect:/person/listAll.action"; //重定向
}
从中也可以看到方法需要什么参数,就可以写上什么参数,springMVC会自动为你赋值。
页面中配置:
<tr align="center">
<td>图片:</td>
<td><input type="file" name="photo"/></td>
</tr>
校验功能实现 在实体类上添加校验注解
Person.java中在属性上配置:
@Size(min=3,max=10,message="用户名必须大于3个字符,小于10个字符")
private String name;
@NotNull(message="年龄不能为空")
private Integer age;
在jsp中:personUpdate.jsp
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %> 引入sf:from标签,在页面中配置该标签即可输出信息。
该标签需要注意的是:from中必须配置modelAttribute="持久化类",否则会报错。
<sf:form action="${pageContext.request.contextPath}/person/saveOrUpdate.action" modelAttribute="person" enctype="multipart/form-data">
<tr align="center">
<td>姓名:</td>
<td><sf:input path="name"/><sf:errors path="name"/></td>
</tr>
<tr align="center">
<td>年龄:</td>
<td><sf:input path="age"/><sf:errors path="age"/></td>
</tr>
在java类中:根据上例的java类中的一部分:
PersonController.java
public String saveOrUpdate(@Valid Person p, BindingResult br,//此参数就是错误配置
@RequestParam("photo") MultipartFile file,
HttpServletRequest request, HttpServletResponse repsonse){
if(br.hasErrors()){
return “person/jPersonUpdate”; //此部分配置的为 有错误返回页面显示错误
}