- 将spring-framework-3.1.1.RELEASE-with-docs.zip/dist/下的所有jar包拷贝到项目的WEB-INF/lib目录下
- web.xml
前端控制器配置:
<!-- 用的是springmvc自带的servlet -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--springmvc.xml 具体进行配置,这里我们只是读取配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
完整的web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<!-- springmvc 前端控制器配置 -->
<!-- 用的是springmvc自带的servlet -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--springmvc.xml 具体进行配置,这里我们只是读取配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<!-- 第一种 *.action 只有访问到 springmvc/login.action 有.action才触发
springmvc
第二种 / 符合现在网页的url 样式 RESTful风格
第三种 /* 最好不要使用 最终处理完需要跳转到一个jsp 代表所有的内容都会经过
DispatcherServlet 再解析jsp 会报错
-->
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
只用SpringMVC开发web应用(没结合Spring时),好像不用配置listener-class;只有SpringMVC无非只需要创建SpringMVC的容器,那么只要有spring-mvc.xml配置文件就可以了,通常会在web.xml中<servlet> <init-param> </init-param> </servlet>部分配置,当然你硬要用ContextLoaderListener来搞SpringMVC也可以。 (配置了一个DispatchServlet后,该servlet在web应用程序启动时立即加载,DispatchServlet加载时会需要一个Spring mvc的配置文件,通过这个配置文件创建一个WebApplicationContext容器对象,也就是上下文环境。)
- springmvc.xml
配置Controller:方式多种,使用扫描包的方式(Spring和SpringMVC都有),主要扫描Controller,把标记了@Controller注解的类转换为bean
<context:component-scan base-package="cn.neusoft.controller"></context:component-scan>
开启注解,能够支持所有MVC注解
<mvc:annotation-driven />
配置ViewResolver
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置jsp 页面的前缀 -->
<property name="prefix" value="/WEB-INF/jsp"></property>
<!-- 配置后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
完整的springmvc.xml:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
<!-- 方法一 配置Controller -->
<!-- 非注解的controller配置要自己加载类,同时给controller起了name -->
<bean id="UsersController1" name="/users.action" class="cn.neusoft.controller.UsersController1"></bean>
<!-- 方法二 项目中一般使用 扫描包的方式 进行 配置 -->
<!-- 好像主要给注解类controller来让spring加载进来的,如果只非注解的controller可以不写 -->
<context:component-scan base-package="cn.neusoft.controller"></context:component-scan>
<!-- 实际开发中使用 加载注解的 适配器、映射器 、 Json转换器 有两种方法,下面的是方法一,还有一种类似非注解的适配器和映射器配置 -->
<!-- 方法一 SpringMVC web 要用的配置和支持mvc注解,说白了就是使Controller中可以使用MVC的各种注解。 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 方法二 非注解的 映射器 以及 适配器 -->
<!-- 配置处理器映射器 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- 配置处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!-- 另外一个适配器 -->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置jsp 页面的前缀 -->
<property name="prefix" value="/WEB-INF/jsp"></property>
<!-- 配置后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
- 下面只使用Controller层和假数据演示
Controller这里有两种写法,一种基于配置的,一种是基于注解的
第一种,基于配置
该Controller类必须实现(implements)org.springframework.web.servlet.mvc.Controller 并 重写 其 ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception的方法;
并且需要在 springmvc.xml 里进行配置:
<bean id="UsersController1" name="/users.action" class="cn.neusoft.controller.UsersController1"></bean>
* 并且对于HandlerMapping 需要使用 org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,HandlerAdapter 需要配置 org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter(这现在大多用<mvc:annotation-driven></mvc:annotation-driven>)
public class UsersController1 implements Controller {
//两种返回信息+视图名的方法都可以
//第一种:implements Controller 然后实现下面这个方法
//第二种:见UsersController2,又有两种,用model存储数据和用request.setAttribute存储数据
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
// TODO Auto-generated method stub
//模拟一下数据库中信息
List<Userinfo> list = new ArrayList<Userinfo>();
//向list 注入数据
Userinfo user1 = new Userinfo();
user1.setUserid(1);
user1.setUsername("neusoft");
user1.setPwd("123");
Userinfo user2 = new Userinfo();
user2.setUserid(2);
user2.setUsername("东软");
user2.setPwd("123");
list.add(user1);
list.add(user2);
ModelAndView mav = new ModelAndView();
//在ModelAndView 把 list 的值 传递
//相当于 实现了 request.setAttribute("users",list);
mav.addObject("users",list);
//指定一个显示的 jsp 页面
mav.setViewName("/users");
return mav;
}
}
第二种,基于注解
只需要 @Controller 既可以标记该类位Controller,@RequestMapping 注解 实现对于url的 path 进行注册
基于注解时,可以通过在方法的参数中引入Model,也可以使用request.setAttribute存储数据
//使用@Controller 标识这个是一个控制器
@Controller
public class UsersController2 {
//使用 RequestMapping 标识了 访问地址 标注在方法上时,value 表示访问该方法的 URL 地址,提供进一步的细分映射信息;标注在类上时,value 相当于一个命名空间,即访问该 Controller 下的任意方法都需要带上这个命名空间,表示类中的所有响应请求的方法都是以该地址作为父路径。。
//注意,我在项目的 web.xml中配置了 只能访问 .action的时候才能触发
//网页地址中需要输入 http://localhost:8080/springmvc/users2.action
//来访问该 地址
//访问地址: http://localhost:8080/springmvc/test.action
//注解的Controller 使用@RequestMapping 时的访问地址是在它的value后加上.action
@RequestMapping("test")
public String test(HttpServletRequest request){
System.out.println("执行该方法");
request.setAttribute("users2", "neusoft");
//return 语句可以返回页面, 由于在springmvc配置中我们配置了前缀和后缀
//会访问到 前缀+ /user2 + 后缀
//页面跳转地址 相当于执行了 转发 request.getRequestDispatcher
//跳转到 WEB-INF/jsp/users2.jsp
return "/users2";
}
//访问地址:http://localhost:8080/springmvc/users2.action
@RequestMapping("users")
public String users(HttpServletRequest request){
List<Userinfo> list = new ArrayList<Userinfo>();
//向list 注入数据
Userinfo user1 = new Userinfo();
user1.setUserid(1);
user1.setUsername("neusoft");
user1.setPwd("123");
Userinfo user2 = new Userinfo();
user2.setUserid(2);
user2.setUsername("东软");
user2.setPwd("123");
list.add(user1);
list.add(user2);
request.setAttribute("users",list);
return "/users";
}
}
使用Model存储数据:
/*
* 映射了两个路径/talent/list,/talent
* */
@RequestMapping(value = {"", "/list"}) //数组
public String talentList(Talent conTalent, Model model, Integer pagecount) {
//查询数据
List<Talent> list = talentService.findList(conTalent);
model.addAttribute("talents",list);
//将视图处理的任务转交给jsp
return "talent/talents";
}
- 页面(这里是jsp)接收获取的数据
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'users.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<center>
<h1>用户列表</h1>
<table border="1">
<tr>
<td>用户编号</td>
<td>用户名</td>
<td>密码</td>
</tr>
<!-- 第二行开始要作信息显示了,信息比较多,我们使用循环 -->
<!-- c:forEach 标签 items 是用来接收数据的 var 用来定义别名 -->
<c:forEach items="${users }" var="d">
<tr> <!--${d.userid } .后面的 userid 是
Userinfo 实体类中 属性的名字 ,这里 必须完全对应,大小写完全一致
-->
<td><a href="#">${d.userid }</a></td>
<td>${d.username }</td>
<td><img alt="${d.pwd }" src="imgs/${d.pwd }"></td>
</tr>
</c:forEach>
</table>
</center>
</body>
</html>