一、视图定位
1. 修改springmvc-servlet.xml,增加:
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/page/" />
<property name="suffix" value=".jsp" />
</bean>
作用是把视图约定在 /WEB-INF/page/*.jsp 这个位置
2. 把 IndexController 类的这一行代码
ModelAndView mav = new ModelAndView("index.jsp");
修改为
ModelAndView mav = new ModelAndView("index");
3. 在 WEB-INF 下新建目录 page,把 index.jsp 移动到 WEB-INF/page 目录下
二、注解方式进行跳转 //服务端跳转
1. 修改 IndexController,在类前面加上 @Controller 表示该类是一个控制器
在方法 handleRequest 前面加上 @RequestMapping("/index") 表示路径 /index 会映射到该方法上
注意:不再让 IndexController 实现 Controller 接口
2. 修改 springmvc-servlet.xml
去掉映射相关的配置,因为已经使用注解方式了,增加:
<context:component-scan base-package="controller" />
表示从包 controller 下扫描有 @Controller 注解的类
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="controller" />
<bean id="irViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/page/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- <bean id="simpleUrlHandlerMapping" -->
<!-- class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> -->
<!-- <property name="mappings"> -->
<!-- <props> -->
<!-- <prop key="/index">indexController</prop> -->
<!-- </props> -->
<!-- </property> -->
<!-- </bean> -->
<!-- <bean id="indexController" class="controller.IndexController"></bean> -->
</beans>
普通情况springmvc-servlet
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
三、注解方式进行页面跳转 //服务端跳转
1. 准备 pojo: Product
在 web 目录下 (不是在 WEB-INF 下)增加商品的页面 addProduct.jsp
注意:产品名称 input 的 name 要使用 name,而不是 product.name
2. 控制器 ProductController,准备一个 add 方法映射 /addProduct 路径
为 add 方法准备一个 Product 参数,用于接收注入
最后跳转到 showProduct 页面显示用户提交的数据
注: addProduct.jsp 提交的 name 和 price 会自动注入到参数 product 里
注: 参数 product 会默认被当做值加入到 ModelAndView 中,相当于:
mav.addObject("product",product);
@Controller
public class ProductController {
@RequestMapping("/addProduct")
public ModelAndView add(Product product) throws Exception {
ModelAndView mav = new ModelAndView("showProduct");
return mav;
}
}
3. 在 WEB-INF/page 目录下创建 showProduct.jsp
用 EL 表达式显示用户提交的名称和价格
四、客户端跳转
1. 首先映射 /jump 到 jump() 方法
在 jump() 中编写如下代码
ModelAndView mav = new ModelAndView("redirect:/index");
redirect:/index 即表示客户端跳转的意思
五、使用 Session
1. 映射 /check 到方法 check()
为方法 check() 提供参数 HttpSession session,这样就可以在方法体中使用 session 了
接下来的逻辑就是每次访问为 session 中的 count + 1
最后跳转到 check.jsp 页面
@RequestMapping("/check")
public ModelAndView check(HttpSession session) {
Integer i = (Integer) session.getAttribute("count");
if (i == null)
i = 0;
i++;
session.setAttribute("count", i);
ModelAndView mav = new ModelAndView("check");
return mav;
}
六、中文问题
修改 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>
七、上传文件
1. 在 web.xml 中新增加一段
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
表示允许访问 *.jpg,配置 springmvc 的 servlet 的时候,使用的路径是 "/",导致静态资源在默认情况下不能访问
并且必须加在 springmvc 的 servlet 之前,配置 spring-mvc 使用的路径是 /*.do 就没问题
2. 配置 springmvc-servlet.xml
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
开放对上传功能的支持
3. jsp 上传页面
<form action="uploadImage" method="post" enctype="multipart/form-data">
选择图片:<input type="file" name="image" accept="image/*" /> <br>
<input type="submit" value="上传">
</form>
上传页面 form 的 method="post" 和 enctype="multipart/form-data" 缺一不可
accept="image/*" 表示只能选择图片进行上传
4. pojo UploadedImageFile
封装 MultipartFile 类型的字段 image,用于接受页面的注入
这里的 image 与 jsp 中的 name 一致
5. 上传控制器 UploadController
@RequestMapping("/uploadImage")
//UploadImageFile 中已经注入好了 image
public ModelAndView upload(HttpServletRequest request, UploadImageFile file)
throws IllegalStateException, IOException {
//获取随机文件名
String name = RandomStringUtils.randomAlphanumeric(10);
String newFileName = name + ".jpg";
//获取 web 目录下的 image 目录,存放上传后的文件
File newFile = new File(request.getServletContext()
.getRealPath("/image"), newFileName);
//System.out.println(request.getServletContext().getRealPath("/image"));
newFile.getParentFile().mkdirs();
//复制文件
file.getImage().transferTo(newFile);
ModelAndView mav = new ModelAndView("showUploadedFile");
//把生成的随机文件名提交给视图
mav.addObject("imageName", newFileName);
return mav;
}
6. jsp 显示页面
<img src="image/${imageName}"/>
八、拦截器
1. IndexInterceptor 拦截器类
public class IndexInterceptor extends HandlerInterceptorAdapter {
/**
* 在业务处理器处理请求之前被调用
* 如果返回 false
* 从当前的拦截器往回执行所有拦截器的 afterCompletion(),再退出拦截器链
* 如果返回 true
* 执行下一个拦截器,直到所有的拦截器都执行完毕
* 再执行被拦截的 Controller
* 然后进入拦截器链
* 从最后一个拦截器往回执行所有的 postHandle()
* 接着再从最后一个拦截器往回执行所有的 afterCompletion()
*/
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle(), 在访问Controller之前被调用");
return true;
}
/**
* 在业务处理器处理请求执行完成后,生成视图之前执行的动作
* 可在modelAndView中加入数据,比如当前时间
*/
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("postHandle(), 在访问Controller之后,访问视图之前被调用,这里可以注入一个时间到modelAndView中,用于后续视图显示");
modelAndView.addObject("date","由拦截器生成的时间:" + new Date());
}
/**
* 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等
*
* 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()
*/
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("afterCompletion(), 在访问视图之后被调用");
}
}
2. 配置拦截器
修改 springmvc-servlet.xml 以对 /index 路径进行拦截
/** 拦截所有
/category/** 拦截/category路径下的所有
xmlns:mvc="http://www.springframework.org/schema/mvc"
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/index"/>
<!-- 定义在 mvc:interceptor 下面的表示是对特定的请求才进行拦截的 -->
<bean class="interceptor.IndexInterceptor"/>
</mvc:interceptor>
<!-- 当设置多个拦截器时,先按顺序调用 preHandle 方法,然后逆序调用每个拦截器的 postHandle 和 afterCompletion 方法 -->
</mvc:interceptors>
SpringMVC 笔记
最新推荐文章于 2022-03-22 10:44:30 发布