Spring学习笔记2——初识Spring MVC

由于对Web方向比较感兴趣,所以在很快的浏览了IOC和AOP之后就直接开始了Spring MVC的学习。

然而事与愿违,Spring MVC的整个架构都离不开IOC和AOP(感觉尤其是IOC),以至于对很多理念和实现不太了解,无奈之下选择了通过慕课网上的一套教学视频直接上手学习,本文就此次学习过程进行总结。

用到的工具有:

1、maven  

2、eclipse_ee  

3、jetty  

PS:之前一直是使用的tomcat,但是此次学习视频中看到教学老师用的是jetty,抱着好奇的心态也尝试了一下使用jetty。作为一只小菜鸟目前没有发现tomcat和jetty之间的差异在哪些方面(笑)。

此前一直没有用过maven,都是通过eclipse ee中的Dynamic Web Project创建Web程序,此次用maven也只是在网上找到的Spring项目的配置文件pom.xml,主要引入了springframework、commons-lang、taglibs和jetty等程序的依赖包,由于不太了解maven故此次不做详细说明。


然后开始Spring的相关配置

一、web.xml的配置

1、DispatcherServlet的配置

DispatcherServlet已经由Spring实现了,故我们不用再写任何相关的代码,只需要将其配置到我们的web应用程序即可

(注:servlet-name的值很重要,默认情况下DispatcherServlet在加载时会从一个基于这个Servlet名字的XML文件中加载Spring应用的上下文)

    <servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>
          org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/configs/spring/spring-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
	
    </servlet>
    
    
    <servlet-mapping>
      <servlet-name>spring</servlet-name>
      <url-pattern>/</url-pattern>
    </servlet-mapping>
2、listener和contextConfigLocation的配置
    <context-param>
 		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/configs/spring/applicationContext*.xml</param-value>
    </context-param>
    
    <listener>
		<listener-class>
			org.springframework.web.context.ContextLoaderListener
		</listener-class>
    </listener>
对listener的配置我不是很明白它的作用,在网上查了之后有这样一种解释:

ContextLoaderListener监听器的作用就是启动Web容器时,自动装配ApplicationContext.xml的配置信息(若只使用了spring-servlet.xml则可以不实现listener)。因为它实现了ServletContextListener这个接口(当容器进行操作时自动完成一些行为),在web.mxl配置这个监听器,启动容器时,就会默认执行它的实现方法。暂时就这样理解,如发现有误再进行改正。

contextConfigLocation的配置就是对applicationContext*.xml的默认读取位置进行了改变,默认地址为/WEB-INF/


总结一下:如果直接采用Spring MVC则可以只配置XXXX-servlet.xml,但是如果要引入其他的架构则需要配置applicationContext.xml。在我这个Web程序中由于用到了JSP,如果不使用applicationContext.xml配置的话是不能得到WebApplicationContext的。所以我在spring-servlet.xml中配置上下文只包含了Controller,而其他的都通过applicationContext.xml进行配置。


二、spring-servlet.xml的配置(applicationContext.xml相似)

        <!-- 启用Spring基于annotation的DI, 使用户可以在Spring MVC中使用Spring的强大功能。 激活 @Required 
		@Autowired,JSR 250's @PostConstruct, @PreDestroy and @Resource 等标注 -->
	<context:annotation-config />

	<!-- DispatcherServlet上下文, 只管理@Controller类型的bean, 忽略其他型的bean, 如@Service -->
	<context:component-scan base-package="com.syh.spring">
		<context:include-filter type="annotation"
			expression="org.springframework.stereotype.Controller" />
	</context:component-scan>

	<!-- HandlerMapping, 无需配置, Spring MVC可以默认启动。 DefaultAnnotationHandlerMapping 
		annotation-driven HandlerMapping -->

	<!-- 扩充了注解驱动,可以将请求参数绑定到控制器参数 -->
	<mvc:annotation-driven />

	<!-- 静态资源处理, css, js, imgs -->
	<mvc:resources mapping="/resources/**" location="/resources/" />


	<!-- 配置ViewResolver。 可以用多个ViewResolver。 使用order属性排序。 InternalResourceViewResolver放在最后。 -->
	<bean
		class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
		<property name="order" value="1" />
		<property name="mediaTypes">
			<map>
				<entry key="json" value="application/json" />
				<entry key="xml" value="application/xml" />
				<entry key="htm" value="text/html" />
			</map>
		</property>

		<property name="defaultViews">
			<list>
				<!-- JSON View -->
				<bean
					class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
				</bean>
			</list>
		</property>
		<property name="ignoreAcceptHeader" value="true" />
	</bean>

	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="viewClass"
			value="org.springframework.web.servlet.view.JstlView" />
		<property name="prefix" value="/WEB-INF/jsps/" />
		<property name="suffix" value=".jsp" />
	</bean>
三、Model、Service和Controller

1、创建Course的javabean,包含它所拥有的属性和相应的getter和setter方法。

2、创建一个service接口,并且通过注解配置为@Service

@Service
public interface CourseService {
	Course getCoursebyId(Integer courseId);
}
3、为这个接口创建一个实现类,CourseServiceImpl,通过注解实现自动注入(在之后的Controller类中使用@Autowired自动注入)

@Service("CourseService")
public class CourseServiceImpl implements CourseService{//业务逻辑就是在这个类中实现

	public Course getCoursebyId(Integer courseId){...}//返回一个Course类,其中包含了需要显示的内容
}

4、CourseController

package com.syh.spring.controller;

import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import com.syh.spring.model.Course;
import com.syh.spring.service.CourseService;

@Controller
@RequestMapping("/courses")
public class CourseController {
	//日志
	private static Logger logger = LoggerFactory.getLogger(CourseController.class);
	//相应的service类,使用注解自动注入
	private CourseService courseService;
	
	@Autowired
	public void setCourseService(CourseService courseService) {
		this.courseService = courseService;
	}
	
        //RESTful风格的请求处理
	@RequestMapping("/view/{courseId}")
	public String viewCourse(@PathVariable("courseId") Integer courseId,
			Map<String, Object> model){
		logger.debug("In viewCourse, courseId = {}", courseId);
		Course course = courseService.getCoursebyId(courseId);
		model.put("course", course);//第一个"course"是一个key,在JSP中可以通过EL表达式直接使用,如${course.learningNum }这样访问Model
		return "course_overview";
	}
	
}



以上!

至于View层就不过多的说明了(都是抄的),暂时就是这样,Spring框架的确是一个非常强大的工具,需要长时间的学习与积累才能够熟练的使用。所以,路还长着呢!

最后,附一张图片吧(跑)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值