一、什么是springMVC:
是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet。
controller(servlet)来起到控制器的作用,用于接受请求,调用对应的model(JavaBean)来进行处理,处理器完成业务处理后返回处理结果给controller,controller再调用对应的view(jsp)对处理结果进行渲染。
二、为什么使用springMVC:
原生的Servlet仍然层次分的不够清晰,Servlet里的编码接近最原始的编程,我们需要自己获取请求上来的数据,并封装成我们内部流转的对象等。
springMVC--->关注点分离(separation of concerns,缩写为 SoC)。
有助于将前端和后端代码拆分为独立的组件,能够更加方便的管理,修改更新。
**Http协议:是一种拉的协议。
三、springMVC和三层架构的区别:
-
三层架构(3-tier application) :
表现层:接收用户请求、转发请求、生成数据的视图,通俗讲就是展现给用户的界面
业务逻辑层:对数据层的操作,对数据业务逻辑处理。
数据持久层:该层所做事务直接操作数据库,针对数据的增添、删除、修改、查找等。
-
MVC(模型Model-视图View-控制器Controller)是表示层的架构模式,表示层最常用的架构模式就是MVC。
Controller(控制器):SpringMvc中,所有的请求都会通过一个前端控制器Servlet,DispatcherServlet就是前端控制器。
Model(模型):通常指的就是我们的数据模型。作用一般情况下用于封装数据。
View(视图):通常指的就是我们的 jsp 或者 html。作用一般就是展示数据的。
实际上没有严格的层的概念:
- “三层”中典型的Model层是以实体类构成的,而MVC里,则是由业务逻辑与访问数据组成的。
四、步骤:
- 导入依赖
- 在spring.xml添加内部资源视图解析器
<!-- 配置内部资源视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="suffix" value=".jsp"></property>
</bean>
- web.xml 里配置SpringMVC核心控制器DispathcerServlet
DispatcherServlet 是 SpringMVC统一的入口, 是前端控制器,所有的请求都通过它
<!--配置DispatcherServlet-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:application.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
/:表示匹配所有请求,其中包含除.jsp和.jspx外的所有后缀。
/*:会覆盖其他所有的servlet,即无论你发出什么请求,都会在该servlet拦截处理,也包括.jsp和.html等静态资源。
/**:什么请求都不能拦截处理,相当于没有设置。
- 创建controller类,使用注解配置controller的业务方法映射地址
@Controller
public class CompanyController {
@Qualifier("companyServiceImpl")
@Autowired
ICompanyService companyService;
@RequestMapping("/back/company/findAll")
public void CompanyFindAll(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String chineseName = req.getParameter("chineseName");
String englishName = req.getParameter("EnglishName");
String phone = req.getParameter("phone");
CompanyVO companyVO = new CompanyVO();
companyVO.setChineseName(chineseName);
companyVO.setEnglishName(englishName);
companyVO.setPhone(phone);
ResultDTO all = companyService.findAll(companyVO);
resp.getWriter().println(JSONObject.toJSONString(all));
}
---------------------------------------------------------------------
QS:
- 在service的test中使用@Autowired去创建ICompanyService companyService;
调用findall时出异常:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.wx.service.ICompanyService.findAll
由于@Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个。
但是由于我们的ICompanyService是继承的IBaseService,并且有很多个实现类实现了IBaseService接口,所以Spring不知道应该绑定哪个实现类,所以抛出了如上错误。
解决:在serviceImpl中加上@Service注解,自动注册到Spring容器,(不需要再在applicationContext.xml文件定义bean),当有多个同一类型的Bean时,可以用@Qualifier(“name”)来指定,@Autowired 和 @Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:application.xml")
public class CompanyServiceImplTest {
@Qualifier(value = "companyServiceImpl")
@Autowired
ICompanyService companyService;
2. 启动tomcat时启动失败,显示:
找到多个名为spring_web的片段。这是不合法的相对排序。有关详细信息,请参阅Servlet规范的第8.2.2 2c节。考虑使用绝对排序。
解决:停掉debug,在out中删除不符合版本的springweb