学习了spring mvc

  今天用spring mvc搭建个例子。

  spring mvc,比较轻量。

  原理是:

  请求通过声明的核心控制器dispatcherServlet,转发给handlerMapper,handlerMapper负责找出相应的controller(我们写的业务处理类)。

  找到controller后进行处理,处理完指定一个modle(用于存储需要显示的数据)及view(可以是一个jsp文件名)。

  返回后,spring mvc将modle中的数据填充到对应view上,最终返回给客户端。

 

  过程中实现了防止定单重复提交,原因是在定单页面生成时在服务器端存储一个随机生成的token,然后将这个token给客户端,客户端的页面有个hidden项,会在正式提交表单时传入该token。第一次,服务器允许通过,并在服务端删除token并返回。第二次再提交时,这时客户端的request中hidden的token为空,因此服务器返回 [表单不能重复提交的提示]


上述实现不是特别好,可以通过在用户提交表单后,服务器处理完后,做redirect

 


学习了spring mvc_第1张图片


  例子:

  1.声明一个spring mvc的dispatcherServlet

   在web.xml中声明:

   <servlet>
        <servlet-name>webrequest</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/webrequest-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>webrequest</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
   

      <!--这个监听只是告诉容器启动时去加载指定spring xml的bean,并进行初始化--> 

      <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/config/videoApplicationContext.xml</param-value>
    </context-param>

2.配置一个viewResolver用于在controler返回view名称时,我们如何解释这个view名称。以及启用标注,及提供映射url到指定controler的method上的类

<!-- 启用spring mvc 注解 -->
    <context:annotation-config />

    <!-- 设置使用注解的类所在的jar包 -->
    <context:component-scan base-package="com.video.*"></context:component-scan>


<!-- 完成请求和注解POJO的映射 -->
    <bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />

    <!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver"
        p:prefix="/jsp/" p:suffix=".jsp" />


3.写我们的controler

@Controller
// 类似Struts的Action
@RequestMapping("/user/")
@SessionAttributes("username")
public class UserController {

    private static final Long lastModify = System.currentTimeMillis();

    @RequestMapping("login.do")
    public ModelAndView login(User user, HttpServletRequest request,
            HttpSession session) {
        ModelAndView mv = new ModelAndView();
        if (request.getParameter("token") == null
                || !request.getParameter("token").equals(
                        session.getAttribute("token"))) {
            mv.setViewName("multiSubmit");
            return mv;
        }
        
        mv.addObject("username", user.getUsername());
        mv.setViewName("index");
        
        //remvoe the token for multi login
        session.removeAttribute("token");
        
        return mv;
    }

}

  

 

你可能感兴趣的:(学习了spring mvc)