(一)搭建开发环境
1.创建动态web工程–springmvc_annocation
2.导入相关的架包及其依赖包
(二)配置相关文件
1.首先配置web.xml文件。在web.xml文件中加入下面的配置信息
[code]
<!– 解决post方式提交时的中文乱码问题 –>
<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>
<!– 通过上下文参数指定分解的上下文配置参数 –>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:beans.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>dispatcher</servlet-name>
<!– <servlet-name>的值+“-servlet”,则为默认配置文件的名称,默认路径为WEB-INF下 本例中的的默认配置文件名称是:dispatcher-bean.xml –>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!– 手动配置文件路径 –>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
[/code]
2.配置springmvc 配置文件,spring-mvc.xml
[code]
<?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:mvc="http://www.springframework.org/schema/mvc"
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.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 ">
<!– 导入类扫描的注解解析器 –>
<context:component-scan base-package="cn.ytu.web.controller"></context:component-scan>
<!– 内部资源视图解析器 prefix logicName suffix /WEB-INF/jsp/ index .jsp –>
<bean id="internalResourceViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!– 前缀 –>
<property name="prefix" value="/WEB-INF/jsp/" />
<!– 后缀 –>
<property name="suffix" value=".jsp" />
</bean>
<!– 注解驱动 –>
<mvc:annotation-driven></mvc:annotation-driven>
<!– 文件上传解析器 id="multipartResolver" id必须这样写 –>
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize">
<value>10485760</value>
</property>
</bean>
<!– 配置映射资源目录 –>
<mvc:resources location="/upload/" mapping="/upload/**" />
</beans>
[/code]
通过context标签配置springmvc容器自动扫描的包,当扫描到该包及其下的各个类中有@controller就会将该类实例化并纳入springmvc容器管理。
2.配置spring配置文件,bean.xml
[code]
<?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:mvc="http://www.springframework.org/schema/mvc"
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.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 ">
<!– 导入类扫描的注解解析器 –>
<context:component-scan base-package="cn.ytu.service"></context:component-scan
</beans>
[/code]
通过context标签配置spring容器自动扫描的包,当扫描到该包及其下的各个类中有@service就会将该类实例化并纳入spring容器管理。 3.service层PersonService.class
[code]
@Service(value = "personService")
public class PersonService {
private static int id;
private static Map<Integer, Person> map = new HashMap<Integer, Person>(); // 存储结构
// 初始化数据(模拟数据库)
static {
Person p = null;
for (int i = 1; i <= 10; i++) {
p = new Person();
p.setId(id);
p.setName("tony" + i);
p.setAge(20 + i);
map.put(id, p);
id++;
}
}
/*
* 模拟dao的操作
*/
public List<Person> list() {
return new ArrayList<Person>(map.values());
}
public Person getPerson(int id) {
return map.get(id);
}
public void save(Person p) {
if (p.getId() == 0) { // 新增
id++;
p.setId(id);
}
map.put(p.getId(), p);
}
public void delete(int id) {
map.remove(id);
}
}
[/code]
该类模拟数据库,并实现了对数据的增删改查基本操作提供服务。 4.控制层PersonController.class (1).用注解方式表明该类为处理器,并指定其映射地址“/person”
[code]
@Controller(value = "personController")
@RequestMapping("/person")
[/code]
(2) 注入service(注解方式)
[code]
@Resource(name = "personService")
private PersonService personService;
[/code]
(3).具体控制器
a.列出所有学生
[code]
@RequestMapping(value = "/listperson", method = RequestMethod.GET)// 子路径
public String list(Map<String, Object> model) {
List<Person> personlist = personService.list();
model.put("personlist", personlist);
return "person/listperson";
}
[/code]
method=RequestMethod.GET 代表该方法只处理指定方式的request请求,对非指定方式的request请求不予以处理. 在浏览器地址栏输入http://localhost:8080/springmvcannocation/person/listperson.action,内部控制器会根据返回值“person/listperson”,通过 配置信息中配置的内部资源视图解析器,找到相应的访问目标,本例为(/WEB-INF/person/listperson.jsp)。并将数据通过map集合封装好带给视图view层。视图 层listperson.jsp获取数据并显示。
b.更新
[code]
@RequestMapping("/update")
public String updataPerson(Integer id, Model model) {
Person p = personService.getPerson(id);
model.addAttribute(p);
return "person/updateperson";
}
[/code]
updataPerson(Integer id, Model model),id要修改对象的编号,从前台获取,要获取的参数直接在方法的参数中声明,框架自动会将页面的对应值传入,(参数名称必须一致)。并将数据通过Mode对象带回给前台。
c.删除
[code]
@RequestMapping("/delperson")
public String delPerson(int id) {
personService.delete(id);
return "redirect:/person/list.action";
}
[/code]
return “redirect:/person/list.action”; // 采用重定向防止页面重复提交
springMVC原理总结:SpringMVC框架DispatcherServlet,每一个请求最先访问的都是DispatcherServlet,DispatcherServlet收到请求后自己不进行处理,而是委托给其他的解析器进行处理,负责转发每一个Request请求给相应的处理器,处理器处理以后再返回相应的视图(View),视图可以对对象进行渲染处理并返回给前台页面,返回的视图和模型都可以不指定,即可以只返回Model或只返回View或都不返回。在使用注解的SpringMVC中,处理器是基于@Controller和@RequestMapping这两个注解的,@Controller声明一个处理器类,@RequestMapping声明对应请求的映射关系,这样就可以提供一个非常灵活的匹配和处理方式。