3.4 使用注解配置SpringMvc
3.5 jsp处理表单
3.5.1配置标签库
<%@taglib uri="http://www.springframework.org/tags/form" prefix="mvc" %>
3.5.2 理解绑定的强大功能
Spring在视图和模型之间提供了强大的绑定功能。用户视图发送数据,数据被自动绑定到模型上面。用户的每一次交互都是web上面的一个HTTP请求,所以SpringMvc将请求参数与command相绑定,其中command对象是一个POJO,其值由用户填充。
<mvc:input path="name"/>
3.5.3 使用表单
<mvc:form modelAttribute="user" action="result.mvc">
<table>
<tr>
<td><mvc:label path="name">Name</mvc:label></td>
<td><mvc:input path="name"/></td>
</tr>
<tr>
<td><mvc:label path="lastname">Last Name</mvc:label></td>
<td><mvc:input path="lastname"/></td>
</tr>
<tr>
<td><mvc:label path="password">Password</mvc:label></td>
<td><mvc:password path="password"/></td>
</tr>
<tr>
<td><mvc:label path="detail">Detail</mvc:label></td>
<td><mvc:textarea path="detail"/></td>
</tr>
<tr>
<td><mvc:label path="birthDate">Birth Date</mvc:label></td>
<td><mvc:input path="birthDate"></mvc:input></td>
</tr>
<tr>
<td><mvc:label path="gender">Gender</mvc:label></td>
<td><mvc:radiobuttons path="gender" items="${genders }"/></td>
</tr>
<tr>
<td><mvc:label path="country">Country</mvc:label></td>
<td><mvc:select path="country" items="${countries}"></mvc:select></td>
</tr>
<tr>
<td><mvc:label path="nonSmoking">Non Smoking</mvc:label></td>
<td><mvc:checkbox path="nonSmoking"/></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="Sbumit"/>
</td>
</tr>
</table>
</mvc:form>
为了实现绑定通过其modelAttribute特性向内部标签公开一个绑定路径,该特性表明根据次类的命名将对应的模型类向视图公开。modelAttribute指向模型类,path指向相同模型类的属性。
3.6使用注解的强大功能
1、 @Controller:表示被注解类作为一个MVC框架的一个Controller的主要注解。Dispatcher Servlet扫描被 @Controller注解的类,从而将Web请求映射到被@RequsetMapping注解的方法之上。与@Service相类似,继承自@Component注解
2、@RequsetMapping:将注解被用来将用户的请求映射到处理器类或方法,可以在类或者方法上使用。可以接受HTTP Servlet 请求相应的对象(Request Reposit)。Http Session对象 InputStream/OutputStream对象等其他对象。
3、@ModeAttribute:该注解使用一个向视图公开的键将一个返回值与一个参数绑定起来。可在方法级别或方法参数上面应用该注解。
在“处理用户注册表单“练习中,通过一个键将一个对象设置为该注解,从而将性别加载到模型中。
@MOdelAttribute("genders")
public Gender[] genders(){
return Gender.values();
}
在方法参数级别,处理器方法获取对象的引用,而该对象包含用户通过表单输入的数据。
@RequestMapping(value="/proccess")
public ModelAndView doSomeStuff(@ModelAttrbut("value") MyObject object){
...
}
4、@PathVariable
该注解将一个方法的参数绑定到一个URL模板。如果可以通过请求URL从用户获取数据,将有利于处理器方法的执行。所以使用带有@PathVariable的给定userid,可以获取用户数据,并且在处理方法中向情求用户显示这些数据,
@RequestMapping(value="/view/{userid}")
public ModelAndView fetchUser(@PathVariable String userid){
...
}
此时方法参数名称与模板相匹配,所以该列没有定义值,但也可以将其定义为@PathVariable{"userid"}。@PathVariable参数可以是任何类型。
5、@ControllerAdvice
该注解能够让我们将代码集中到一个地方、以便跨控制器共享代码。
6、@InitBinder
确定初始化WebDataBinder的方法。关闭请求参数到模型对象的自动数据的绑定。注册自定义编辑器,
7、@ExceptionHandler
异常注解
3.7验证用户登录。
前端设置
3.8 上传文件
Dispatcher Servlet检测到文件上传请求时,会将工作委托给前面声明的其中的一个多部分解析器来完成。解析器将其解析成多部分文件和参数并创建MultipartHTTPServletRequest实例。当使用Commons FileUpload方法时,可以通过定义解析器的属性来配置上传流程。
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="uploadTempDir" value="/tmp"/>
<property name="maxUploadSize" value="1048576"/>
<property name="maxInMemorySize" value="524228"/>
</bean>
uploadTempDir:设置临时目录
maxUploadSize:上传被拒绝之前允许的最大字节数
maxInMemorySize:上传文件保存到临时文件夹之前允许的最大字节数。
pom.xml配置
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>coomons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
spring上传文件的代码编写
@Controller
public class UploadControl {
@RequestMapping(value="/form")
public ModelAndView user(){
ModelAndView modelAndView =new ModelAndView("upLoad", "user",new User());
return modelAndView;
}
@RequestMapping(value="/upload")
public ModelAndView processUser(User user,HttpServletRequest request) throws Exception{
ModelAndView modelAndView = new ModelAndView();
load(request);
modelAndView.addObject("username",user.getName());
modelAndView.addObject("fileLength", user.getFile().getBytes().length);
modelAndView.addObject("message", "hello reader");
modelAndView.setViewName("helloReader");
return modelAndView;
}
private void load(HttpServletRequest request) throws IllegalStateException, IOException{
long startTime=System.currentTimeMillis();
//将当前上下文初始化给 CommonsMutipartResolver (多部分解析器)
CommonsMultipartResolver multipartResolver=new CommonsMultipartResolver(
request.getSession().getServletContext());
//检查form中是否有enctype="multipart/form-data"
if(multipartResolver.isMultipart(request))
{
//将request变成多部分request
MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request;
//获取multiRequest 中所有的文件名
Iterator iter=multiRequest.getFileNames();
while(iter.hasNext())
{
//一次遍历所有文件
MultipartFile file=multiRequest.getFile(iter.next().toString());
if(file!=null)
{
String path=request.getServletContext().getRealPath("/tmp/")+file.getOriginalFilename();
System.out.println(path);
//上传
file.transferTo(new File(path));
}
}
}
long endTime=System.currentTimeMillis();
System.out.println("方法三的运行时间:"+String.valueOf(endTime-startTime)+"ms");
}
}
User.java
package com.tzg.ch303;
import org.springframework.web.multipart.MultipartFile;
public class User {
private String name;
private MultipartFile file;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public MultipartFile getFile() {
return file;
}
public void setFile(MultipartFile file) {
this.file = file;
}
}
文件配置
前端代码
<table>
<tr>
<td>Name</td>
<td><mvc:input path="name"/></td>
</tr>
<tr>
<td>Choose File</td>
<td><mvc:input type="file" path="file"/>
</tr>
<tr>
<td colspan="2"><input type="submit" value="submit"></td>
</tr>
</table>
3.9异常处理
3.10实现国际化
3.11使用主题