β

Spring MVC 框架学习(二) 基于注解的spring mvc入门

码农日记 260 阅读

(一)搭建开发环境

1.创建动态web工程–springmvc_annocation

2.导入相关的架包及其依赖包

(二)配置相关文件

1.首先配置web.xml文件。在web.xml文件中加入下面的配置信息



<!-- 解决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>

2.配置springmvc 配置文件,spring-mvc.xml


<?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>

通过context标签配置springmvc容器自动扫描的包,当扫描到该包及其下的各个类中有@controller就会将该类实例化并纳入springmvc容器管理。

2.配置spring配置文件,bean.xml


<?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>

通过context标签配置spring容器自动扫描的包,当扫描到该包及其下的各个类中有@service就会将该类实例化并纳入spring容器管理。 3.service层PersonService.class


@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);
    }
}

该类模拟数据库,并实现了对数据的增删改查基本操作提供服务。 4.控制层PersonController.class (1).用注解方式表明该类为处理器,并指定其映射地址“/person”


@Controller(value = "personController")
@RequestMapping("/person")

(2) 注入service(注解方式)


@Resource(name = "personService")
 private PersonService personService;

(3).具体控制器
a.列出所有学生


@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";
    }

method=RequestMethod.GET 代表该方法只处理指定方式的request请求,对非指定方式的request请求不予以处理. 在浏览器地址栏输入http://localhost:8080/springmvcannocation/person/listperson.action,内部控制器会根据返回值“person/listperson”,通过 配置信息中配置的内部资源视图解析器,找到相应的访问目标,本例为(/WEB-INF/person/listperson.jsp)。并将数据通过map集合封装好带给视图view层。视图 层listperson.jsp获取数据并显示。
b.更新


@RequestMapping("/update")
    public String updataPerson(Integer id, Model model) { 
        Person p = personService.getPerson(id);
        model.addAttribute(p);
        return "person/updateperson";
    }

updataPerson(Integer id, Model model),id要修改对象的编号,从前台获取,要获取的参数直接在方法的参数中声明,框架自动会将页面的对应值传入,(参数名称必须一致)。并将数据通过Mode对象带回给前台。
c.删除


@RequestMapping("/delperson")
    public String delPerson(int id) {
        personService.delete(id);
        return "redirect:/person/list.action";
    }

return “redirect:/person/list.action”; // 采用重定向防止页面重复提交
springMVC原理总结:SpringMVC框架DispatcherServlet,每一个请求最先访问的都是DispatcherServlet,DispatcherServlet收到请求后自己不进行处理,而是委托给其他的解析器进行处理,负责转发每一个Request请求给相应的处理器,处理器处理以后再返回相应的视图(View),视图可以对对象进行渲染处理并返回给前台页面,返回的视图和模型都可以不指定,即可以只返回Model或只返回View或都不返回。在使用注解的SpringMVC中,处理器是基于@Controller和@RequestMapping这两个注解的,@Controller声明一个处理器类,@RequestMapping声明对应请求的映射关系,这样就可以提供一个非常灵活的匹配和处理方式。

作者:码农日记
Android, iOS, HTML5, Cloud and more
原文地址:Spring MVC 框架学习(二) 基于注解的spring mvc入门, 感谢原作者分享。

发表评论