SpringMVC第一天
2017-07-20 本文已影响0人
原来蜗牛不是牛
介绍一下MVC
- MVC就是一个设计模式,最简单的web界面开发,我们直接写一个jsp页面就完事了,但是现在将web端分成了三层,全名是Model View Controller,是模型(model)—视图(view)—控制器(controller)的缩写,目的是为了系统的框架,分层更加清晰,可扩展性更强,降低系统的耦合度。
MVC既然是一个设计模式,所以它既可以适用于C/S应用也可以适用于B/S应用,下面这张图介绍了在B/S模式下的应用
MVC
MVC的执行步骤:
- 用户发起Request请求至控制器(Controller),控制器接收用户的请求,并将请求委托给模型进行处理。
- 控制器请求模型(Model),模型处理业务数据并得到处理结果,模型通常是指业务逻辑,包括Pojo、Service、Dao等三层
- 模型将处理结果返回给控制器
- 控制器将模型数据在视图(View)中展示
说明:web中模型无法将数据直接在视图上显示,需要通过控制器完成。如果在C/S应用中模型是可以将数据在视图中展示的。 - 控制器将视图响应结果,Response响应给用户,通过视图展示给用户数据或者处理结果。
MVC各部分的作用:
- Controller的作用
封装web请求为一个数据对象、调用业务逻辑层来处理数据对象、返回处理数据结果及相应的视图给用户。 - Model的作用
处理业务数据,并返回处理结果 - View的作用
渲染视图,并将数据或处理结果展示给用户
什么是SpringMVC
在Spring框架中的位置
![]{{1)49V(VOTG~`7YTFFN)T.png](https://img.haomeiwen.com/i3905877/4a4bad044b17fb74.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
SpringMVC是Spring框架的一个模块,我们可以从Spring的整体结构中看出来,是属于表现层的框架,是基于MVC的WEB框架
SpringMVC工作原理图
工作原理图中央控制器(DispatcherServlet):接收请求,响应结果,相当于电脑的CPU。
处理器映射器(HandlerMapping):根据URL去查找处理器
处理器(Handler):(需要程序员去写代码处理逻辑的)
处理器适配器(HandlerAdapter):会把处理器包装成适配器,这样就可以支持多种类型的处理器,类比笔记本的适配器(适配器模式的应用)
视图解析器(ViewResovler):进行视图解析,多返回的字符串,进行处理,可以解析成对应的页面
开发步骤方式一(根据工作原理图开发,基于配置文件)
- 配置中央控制器和过滤器
配置在web.xml中
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 配置spring自带的过滤器 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 1.配置中央控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
- 配置处理器映射器(Spring配置文件中)
applicationContext.xml
<!-- 2.配置处理器映射器,按照bean的名称来查找 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
通过action对象的name属性来查找
- 配置处理器适配器
<!-- 3.配置处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" ></bean>
- 配置视图解析器
<!-- 4.配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" ></bean>
- 创建Action对象,通过name属性标识
<!-- 5.配置Action,按名称查找 -->
<bean name="/test.action" class="com.chenx.action.TestAction" ></bean>
- 开发Action(实现Controler接口)
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class TestAction implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView();
mav.setViewName("index.jsp");
return mav;
}
}
开发步骤方式二(基于配置文件)
- 配置中央控制器(同上)
- 配置处理器映射器
<!-- 2.配置适配器映射器 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" >
<property name="mappings">
<props>
<prop key="/test.action">testAction</prop>
</props>
</property>
</bean>
- 配置处理器适配器
<!-- 3.配置适配器控制器 -->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter" ></bean>
- 配置视图解析器(同上)
- 创建Action对象,通过id属性来标识,与处理器映射器相对应
<!-- 5.创建action对象,通过id查找 -->
<bean id="testAction" class="com.chenx.action.TestAction" ></bean>
- 开发Action,实现HttpRequestHandler接口
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.HttpRequestHandler;
public class TestAction implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}
开发步骤方式三(基于注解)--推荐
- 配置中央控制器(同上)
- 配置处理器映射器+配置处理器适配器
<!-- 2.配置适配器映射器 3.配置适配器控制器-->
<mvc:annotation-driven></mvc:annotation-driven>
- 配置视图解析器
<!-- 4.配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" ></bean>
- 添加注解扫描
<!-- 5.添加注解扫描 -->
<context:component-scan base-package="com.chenx.action"></context:component-scan>
- 开发注解Action
1.开发的注解action不用实现接口
2.方法名称自定义
3.路径映射名称在方法中自定义。
4.一个模块的所有功能可以写在一个类中(多个方法)
import java.util.ArrayList;
import java.util.List;
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.servlet.ModelAndView;
import com.chenx.model.User;
@Controller
/*@RequestMapping("/test")*/
public class TestAction {
@RequestMapping("/test.action")
protected ModelAndView testA(HttpServletRequest request,HttpServletResponse response){
ModelAndView mav = new ModelAndView();
String uname = request.getParameter("username");
String upwd = request.getParameter("pwd");
System.out.println(uname+"\t"+upwd);
List<User> users = new ArrayList<>();
User user1 = new User("陈枭", "aaaaaaaaa", 34);
User user2 = new User("陈其", "bbbbbbbb", 45);
User user3 = new User("王维虹", "ccccccc", 13);
User user4 = new User("徐俊", "ddddddddd", 35);
users.add(user1);
users.add(user2);
users.add(user3);
users.add(user4);
mav.addObject("users", users);
mav.setViewName("show.jsp");
return mav;
}
}
工作中路径名这些定义好就不要改,因为是提供给其他同事的接口,牵一发动全身
- 贴一下测试页面代码
index.jsp
<body>
<div>
<form action="test.action" method="post">
<div>用户名:<input type="text" name="username" /></div>
<div> 密码:<input type="password" name="pwd" /></div>
<div><input type="submit" value="提交"></div>
</form>
</div>
</body>
show.jsp(maven默认创建servlet的版本为2.3,记得开起使用EL表达式)
<body>
<div>
<table>
<thead>
<tr>
<th>姓名</th>
<th>密码</th>
<th>年龄</th>
</tr>
</thead>
<tbody>
<c:forEach items="${users }" var="u">
<tr>
<td>${u.name }</td>
<td>${u.pwd }</td>
<td>${u.age }</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</body>
总结
开发思路:
- 中央控制器(拦截器)
- 处理器映射器(找action)
- 处理器适配器(执行action)
- 视图解析器
- 开发action
- 开发View(JSP)
- 开发Model和数据库交互