文章目录
你或许需要一些struts2基础
笔者有struts2基础。这是看这篇文章的前提。
简介
SpringMVC是一款Web MVC框架。 它跟Struts框架类似,是目前主流的Web MVC框架之一。
基本流程
1、在web.xml中配置入口servlet
web.xml的部分代码:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2、配置文件为dispatcher-servlet.xml(相当于struts.xml)
配置文件命名
注意这里的配置文件叫dispatcher-servlet.xml是因为,前面的web.xml中servlet-name为dispatcher,需要对应。比如servlet-name为springmvc,则配置文件就叫springmvc-servlet。
文件位置
① WEB-INF文件夹下
像上面的web.xml中DispatcherServlet配置声明中,没有明确DispatcherServlet前端控制器配置文件的位置时,则系统默认DispatcherServlet前端控制器配置文件放在WEB-INF文件夹下。
② 根据contextConfigLocation的value进行判断
现在web.xml文件变成下面这样,也即多了init-param,contextConfigLocation就是配置文件放的地方,这里表示放在resources的config文件夹下,这个config文件夹就是自己新建的,当然放在别的自己建的文件夹下面也可以。
<!--拦截请求(url-pattern为 / ,说明拦截所有请求),并交由Spring MVC的后台控制器来处理。这一项配置是必须的-->
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/mvc-dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</servlet>
文件内容
①数据库信息还是配置在applicationContext.xml中
②***spring注解方式:自动扫描并注入bean***
<context:component-scan base-package="com.yogi.xx.xx" />
通常情况下我们在创建spring项目的时候在xml配置文件中都会配置这个标签,配置完这个标签后,spring就会去自动扫描base-package对应的路径或者该路径的子包下面的java文件,如果扫描到文件中带有@Service,@Component,@Repository,@Controller
等这些注解的类,则把这些类注册为bean. 注意不带的话是不能自动注册为bean的哦。
注:在注解后加上例如 @Controller(value="aaa")
时,注册的这个类的bean的id就是aaa. 如果@Controller不指定其value,则默认的bean名字为这个类的类名首字母小写,
3、Controller(类似于Struts中的Action)
举个例子(从别的博客复制过来的),这是一个员工操作的controller。
这里的注解含义:
@Controller注解就是表明这是一个Controller,且会被spring容器进行初始化。
① @RequestMapping——映射请求URL
@RequestMapping("/")中的"/"的意义就是contextPath后面的路径;也就是http://host:port/contextPath
后面的路径,例如项目叫test,端口为8080,下面这个代码中/employee即为http://localhost:8080/test/employee
,方法中的映射是在类的基础之上的,例如EmployeeController的add方法,最终起作用的路径是 http://host:port/contextPath/employee/add
@RequestMapping注解的method参数
method参数表示的HTTP请求的方式。注解默认会映射所有的HTTP请求方法。如果仅想接收某种请求方法,可以使用@RequestMapping(method=GET)来缩小范围,常见的参数有GET,PUT,POST,DELETE等。若请求的方法与后台编写的方法不一致,会出现HTTP 405错误。
@Controller
@RequestMapping(value = "/employee")
public class EmployeeController {
@Autowired
private IEmployeeService employeeService;
@Autowired
private IDeptService deptService;
@RequestMapping
public ModelAndView index() {
ModelAndView view = new ModelAndView("employee/list");
List<Employee> employees = employeeService.list();
view.addObject("list", employees);
return view;
}
@RequestMapping(method = RequestMethod.POST, value = "/delete/{employeeId}")
@ResponseBody
public String delete(@PathVariable Integer employeeId) {
employeeService.delete(employeeId);
return "success";
}
@RequestMapping(method = RequestMethod.GET, value = "/add")
public ModelAndView add(ModelAndView view) {
view.setViewName("employee/form");
view.addObject("depts", deptService.listAll());
return view;
}
@RequestMapping(method = RequestMethod.GET, value = "/detail/{employeeId}")
public ModelAndView detail(@PathVariable Integer employeeId, ModelAndView view) {
view.setViewName("employee/form");
view.addObject("employee", employeeService.getById(employeeId));
view.addObject("depts", deptService.listAll());
return view;
}
@RequestMapping(method = RequestMethod.POST, value = "/update")
public String add(Employee employee) {
if(employee.getDept().getId() == null) {
employee.setDept(null);
}
employeeService.saveOrUpdate(employee);
return "redirect:/employee/";
}
}
② 通过@ResponseBody注解返回数据
该注解用于将Controller的方法返回的对象,根据HTTP Request Header的Accept的内容,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:
返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;
具体示例可以参考:Spring mvc 通过@ResponseBody注解返回数据
③ @RequestParam
以下这三种方法均可
第一种必须带有参数,也就是说你直接输入localhost:8080/list 会报错 不会执行方法 只能输入localhost:8080/list?parentId=? 才能执行相应的方法
第二种 可带参数也可不带参数 你输入 localhost:8080/list 不会出问题
第三种 带了参数会接收,不带参数会默认为0
@RequestMapping("/list")
public String test( Long parentId) {
}
@RequestMapping("/list")
public String test(@RequestParam(required=false) Long parentId) {
......
}
@RequestMapping("/list")
public String test(@RequestParam(defaultValue="0") Long parentId) {
......
}
注意之前的时候参数名就是parentId,当然也可以给参数另取名字:
@RequestMapping("/list")
public String test(@RequestParam(value="id") Long parentId) {
..
}
这个时候就不是/list?parentId=?了,而是/list?id=?
④@Component、@Controller、@Service及@Repository
@Component
注解的作用就和在XML配置文件中编写<bean id="" class="">
实现的功能是一样的,都是用于把当前类对象存入spring容器中。注解后可以被spring框架所扫描并注入到spring容器来进行管理。(注意需要配置自动扫描路径)
@Component的value属性用于指定bean的id。当我们不写时,它的默认值是当前类名首字母改小写。
@Controller
、@Service
、@Repository
其实也是一样的,只是名字不一样代表了不同的层,便于区分,其中@Repository代表数据持久层。
⑤ @Autowired 、@Resource及@Qualifier
@Autowired和@Resource都可以用来装配bean,都可以用于字段或方法。但@Autowired属于Spring的,而@Resource为JSR-250标准的注释,属于J2EE的。在这里我们只讨论@Autowired.
@Autowired则代替了之前XML配置文件中<bean>
标签下的<property>
标签(也即和@Component等这些标签一起代替了整个bean标签),可以用于注释元素(即属性) 或者元素的setter方法,注释元素时可以不写setter方法,只要前面自动扫描到了比如说@controller,就可以自动注入了。
在实例化了不止一个bean时,(比如用xml配置时<bean id="" class="">
,即同一个类有不止一个id),需要使用@Qualifier(“id名”),来说明应该注入哪一个实例的值。
@Autowired
@Qualifier("bmwCar")
private ICar car;