Spring MVC 基本配置文件:
web.xml
springMVC.xml
视图定位:
- 配置文件(
springmvc.xml
)。 - 如下配置定义跳转文件的前后缀,把视图约定在
/WEB-INF/jsp/*.jsp
位置。
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
注解方式:
- 配置文件(
springmvc.xml
)。 - 如下配置表示从包controller下扫描有
@Controller
注解的类。
<context:component-scan base-package="controller" />
- 示例:
@Controller
public class IndexController {
@RequestMapping("/index")
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView("index"); //index.jsp页面自行添加
mav.addObject("message", "Hello Spring MVC");
return mav;
}
}
注:jsp文件放在WEB-INF
下是不能直接访问的,而在webapp
下可以直接访问。直接访问是指http://localhost:8080/addProduct.jsp
。
接受表单数据:
- pojo
public class Product {
private int id;
private String name;
private float price;
// 省略get、set方法
}
- jsp页面
<form action="addProduct">
产品名称 :<input type="text" name="name" value=""><br />
产品价格: <input type="text" name="price" value=""><br />
<input type="submit" value="增加商品">
</form>
- controller
@Controller
public class ProductController {
@RequestMapping("/addProduct")
public ModelAndView add(Product product) throws Exception {
ModelAndView mav = new ModelAndView("showProduct");
//此处product会自动传入mav中,可以省略如下代码
//mav.add("product", product);
return mav;
}
}
- showProduct.jsp
产品名称: ${product.name}<br>
产品价格: ${product.price}
注意:1. input的name值要与传入参数中的属性值对应(名称相等)2. action的值与RequestMapping的值,在对tomcat进行配置的时候,使用的路径是"/",所有action中不在需要添加"/" ,不加"/"是相对路径 。
springmvc的工作模式是当页面传递过来有参数name
的时候,同时检测到参数的Product类有setName
方法,那么就会把参数name
的值注入到product
对象里去。
中文问题:
- 配置文件(web.xml)
<!-- 中文过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- jsp页面:form需要设置
method="post"
<form action="addProduct" method="post">
...
</form>
上传文件:
- 配置
web.xml
允许访问*.jpg
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
- 配置
springmvc.xml
:开放上传功能的支持。
<!-- 对上传文件的解析 :开放上传功能的支持 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />
upload.jsp
<form action="uploadImage" method="post" enctype="multipart/form-data">
选择图片:<input type="file" name="image" accept="image/*" /> <br>
<input type="submit" value="上传">
</form>
- pojo UploadedImageFile
public class UploadedImageFile {
MultipartFile image;
public MultipartFile getImage() { return image; }
public void setImage(MultipartFile image) { this.image = image; }
}
- controller
@Controller
public class UploadController {
@RequestMapping("/uploadImage")
public ModelAndView upload(HttpServletRequest request, UploadedImageFile file)
throws IllegalStateException, IOException {
String name = RandomStringUtils.randomAlphanumeric(10);
String newFileName = name + ".jpg";
File newFile = new File(request.getServletContext().getRealPath("/image"), newFileName);
newFile.getParentFile().mkdirs();
file.getImage().transferTo(newFile);
ModelAndView mav = new ModelAndView("showUploadedFile");
mav.addObject("imageName", newFileName);
return mav;
}
}
- showUploadedFile.jsp
<img src="image/${imageName}"/>
<%-- 默认的相对路径在springmvc_war_exploded 下面--%>
注:图片存储路径可通过System.out.println(newFile);
得知; jsp页面中默认相对路径在springmvc_war_exploded下。