java_springMVC_介绍及开发流程
一、历史
2008年之前使用的只是servlet开发,它的最大缺点是,将视图层、业务逻辑层、数据交互层写到了一起,无法区分开来。可维护性差。
后来演变出了jsp,它很好的解决了视图层与业务层的分离。JavaBean充当我们的数据交互层,这也是最早期MVC模型的原型。JSP(视图层)+Servlet(控制层)+JavaBean(数据层)。
再后来演变出了webwork,它就是strust1的前身。后来被融入strust了。它是单例多线程的,因此一个类中无法处理多个业务逻辑。和servlet一样,一个action只能处理一个业务逻辑。
再后来演变出了strust2,可以进行多业务的处理了,即一个action中可以写多个方法。从2008/09年到2012年间为企业的主流框架,即SSH。
从2013年很多企业都开始使用springMVC了。
二、SpringMVC流程
三、开发springMVC工程的流程
1.创建工程
创建一个web项目,名称为:firstSpringMVC
最后一步记得钩选自动生成web.xml选项。
新建后结构如下:
2.导入包
复制jar包到lib目录中:
commons-beanutils-1.8.0.jar
commons-fileupload-1.2.1.jar
commons-io-2.0.1.jar
commons-lang3-3.1.jar
commons-logging-1.1.3.jar
commons-pool-1.2.jar
spring-aop-4.1.5.RELEASE.jar
spring-aspects-4.1.5.RELEASE.jar
spring-beans-4.1.5.RELEASE.jar
spring-context-4.1.5.RELEASE.jar
spring-context-support-4.1.5.RELEASE.jar
spring-core-4.1.5.RELEASE.jar
spring-expression-4.1.5.RELEASE.jar
spring-web-4.1.5.RELEASE.jar
spring-webmvc-4.1.5.RELEASE.jar
spring-webmvc-portlet-4.1.5.RELEASE.jar
另外还需要复制log4j.properties文件,用于输出日志。:
3.配置web.xml
在web.xml中增加如下内容:
<!-- 配置SpringMVC -->
<servlet>
<servlet-name>springMVCName</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springMVC.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVCName</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
在这里,<url-pattern>定义了整个请求-响应的映射载体:URL;而<servlet-name>则将<servlet>节点和<servlet-mapping>节点联系在一起形成请求-响应的映射关系;<servlet-class>则定义了具体进行响应的Servlet实现类。
这段入口程序的配置中隐藏了SpringMVC的两大要素(核心分发器Dispatcher和核心配置文件[servlet-name]-servlet.xml)之间的关系表述:
以一个Servlet作为入口程序是绝大多数MVC框架都遵循的基本设计方案。这里的DispatcherServlet被我们称之为核心分发器,是SpringMVC最重要的类之一。
Spring提供了一个初始化的配置选项,通过指定contextConfigLocation选项来自定义SpringMVC核心配置文件的位置。也可以去掉此段代码,SpringMVC在这里采用了一个“命名约定”的方法进行关系映射,这种方法很廉价也很管用。我们就必须在/WEB-INF/目录下,放一个名为“名称-servlet.xml”的Spring配置文件作为SpringMVC的核心配置用以指定SpringMVC的基本组件声明定义。 如上面的servlet名称为:<servlet-name>springMVCName</servlet-name>,
SpringMVCName,因此默认需要创建一个名为springMVCName-servlet.xml的配置文件。但是因为<init-param>中配置了名称为springMVC.xml,因此使用此名称的配置文件。
4.配置”名称-servlet.xml”
正如上面所说,需要在/WEB-INF/目录下新建一个名为:firstSpringMVC-servlet.xml的文件。但是,因为web.xml中的init-param中定义了配置文件的路径和名称,因此需要在/WEB-INF目录中创建名为springMVC.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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
</beans>
在此配置文件中添加使用注解的bean。因此先创建一个controller类(先跳到下一节创建controller类)。
然后在此配置文件中增加如下配置:
<!-- 扫描类包以应用注解定义的Bean -->
<context:component-scan base-package="com.gary.controller" />
注:不要在这里扫dao、service中的包。因为controller中会用到dao或service,当扫controller包时就会加载其实例,此时dao和service还没有注入,直接使用将是一个空壳。
因此dao和service需要放到上下文中,先于此处的扫包被加载。
5.创建controller类
创建一个包:com.gary.controller
添加一个类:UserController
package com.gary.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping(method = RequestMethod.GET, value = "/dologin")
public String dologin(
HttpServletRequest request, HttpServletResponse response,
String username, String password){
System.out.println("dologin : " + username + " - " + password);
return "";
}
}
6.测试
启动服务,在页面中输入:
http://localhost:8080/firstSpringMVC/user/dologin?username='abc'&password='123'
后台打印:
说明上面的配置正确。
7.返回页面
返回页面需要配置一个视图解析器。
在上面的springMVC.xml配置文件中,扫描包后面添加如下配置:
<!-- 配置视图解析器 -->
<bean name="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 指定页面存放的路径 -->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<!-- 指定后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
将上面的controller类返回值修改一下:
@RequestMapping(method = RequestMethod.GET, value = "/dologin")
public String dologin(
HttpServletRequest request, HttpServletResponse response,
String username, String password){
System.out.println("dologin : " + username + " - " + password);
return "login/welcome";
}
返回的字串需要和视图解析器中的配置结合起来,将路径放到前面,将后缀放到后面,即:
/WEB-INF/jsp/login/welcome.jsp
因此,需要在WEB-INF目录下创建jsp/login目录,并且在login目录下创建一个welcome.jsp文件。
同时,为了更具有说明性,我们再增加upload和download两个目录,显得更像一个真实的工程,结构如下:
welcome.jsp中添加一个标签:
再次启动服务,访问user/dologin,返回了页面,同时后台也打印了内容。
8.访问首页
访问首页的意思是,当在页面中输入http://localhost:8080/firstSpringMVC
时,应该显示一个首页。
有两种方式:
一、在web.xml中配置:
<display-name>firstSpringMVC</display-name>
<welcome-file-list>
<welcome-file>home.jsp</welcome-file>
</welcome-file-list>
此时只需要在根目录下(WEB-INF的平级目录)放一个home.jsp,程序就会自动引用显示。
注意,这里是直接显示home.jsp,因此如果页面中需要后台的参数那是拿不到的,所以这个页面一定要是静态的,一般用home.html或index.html会更便于理解。