SpringMVC 笔记

一、视图定位
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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值