SpringMVC

一、什么是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:

  1. 在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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值