今天用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
例子:
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;
}
}