简称 | 含义 |
---|---|
S | SpringMVC/Struts |
S | Spring |
H | Hibernate |
第一个S:表示的是控制器的解决方案,SpringMVC 是控制器的解决方案(相当于替代了原来的Servlet)
第二个S:Spring(整合第三方框架、为Service层提供事务)
第三个H:这个是DAO的解决方案
因为Servlet是最原生的实现、很多的实现 都比较繁琐:请求参数的自动封装、编码问题解决、文件的上传和下载问题、要实现防止重复提交的问题、在每一次编写请求的时候都需要带上方法名判断就变得复杂了、每一次跳转我们都需要自己去写代码、这就让这个Servlet的使用代码量就变得繁琐了。
SpringMVC产生以后, 也就是说我们的SpringMVC只需要写很少的代码就能够完成上述的功能了
SpringMVC实际上你可以认为就是一个Servlet的封装、只不过这个封装能够更好的解决Servlet中的所有问题
请求参数的自动封装
编码问题的处理
请求的JSON格式自动转换成JAVA对象 返回的JAVA对象自动转换成JSON格式
页面跳转的封装
表单文件防止重复提交的问题
上传下载的简化
日期格式的自动转换
SpringMVC的第一个HelloWorld程序
Core 、aop、web、webmvc
- <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
- <display-name>Demo_SpringMVC_01display-name>
- <welcome-file-list>
- <welcome-file>index.htmlwelcome-file>
- <welcome-file>index.htmwelcome-file>
- <welcome-file>index.jspwelcome-file>
- <welcome-file>default.htmlwelcome-file>
- <welcome-file>default.htmwelcome-file>
- <welcome-file>default.jspwelcome-file>
- welcome-file-list>
-
-
-
- <servlet>
- <servlet-name>DispatcherServlet1servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
- servlet>
- <servlet-mapping>
- <servlet-name>DispatcherServlet1servlet-name>
- <url-pattern>*.actionurl-pattern>
- servlet-mapping>
- web-app>
- 复制代码
- <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:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-4.0.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc.xsd" default-autowire="byName">
-
- <bean name="/hello.action" class="com.qy.helloworld.HelloWorldControll">bean>
- beans>
- 复制代码
- public class HelloWorldControll implements Controller{
- @Override
- public ModelAndView handleRequest(HttpServletRequest request,
- HttpServletResponse response) throws Exception {
- System.out.println("我是Controll我执行了....");
-
- ModelAndView modelAndView=new ModelAndView();
- //设置跳转的页面
- modelAndView.setViewName("/yuyu.jsp");
-
- return modelAndView;
- }
- }
- 复制代码
配置文件的名字是不能乱写的,web.xml中配置的servlet的名字-servlet.xml配置的
SpringMVC实际上只是Spring的一个模块 所以配置文件的约束是一样的
编写实现于Controll接口的这个重写的方法 里面的ModelAndView返回的是视图和数据的集合(这里的数据默认是放到了request域对象里面的)
在SpringMVC的配置文件中 name表示的是映射的路径、映射路径前面必须加上/
在编写配置文件的路径映射的时候 不能写 /.action(没有这种写法),/ *.action /anana/anan
- <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:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-4.0.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc.xsd" default-autowire="byName">
-
- <bean name="/hello.action" class="com.qy.helloworld.HelloWorldControll">bean>
-
-
- beans>
- 复制代码
- <servlet>
- <servlet-name>DispatcherServlet1servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
-
-
- <init-param>
- <param-name>contextConfigLocationparam-name>
- <param-value>classpath:config/spring-mvc.xmlparam-value>
- init-param>
-
- servlet>
- <servlet-mapping>
- <servlet-name>DispatcherServlet1servlet-name>
- <url-pattern>*.actionurl-pattern>
- servlet-mapping>
- 复制代码
请求会被转发到映射器上面去 映射器的请求会将请求分离
映射器将分离出来的数据转发到适配器(适配器就专门来找 是实现了接口的控制器 还是继承于类的控制器 还是既没有实现接口 也没有继承类的这个控制器)
控制器拿到请求处理请求 返回数据和 返回视图 到 视图解析器
视图解析器拿到最终要跳转的页面 进行转发 转到 显示页面
- <context:component-scan base-package="com.qy.anotation">context:component-scan>
-
- <mvc:annotation-driven>mvc:annotation-driven>
- 复制代码
@Controll:表示当前的这个类是一个控制器
@RequestMapping:表示的是请求路径的映射
@GetMapping:这个表示的是当前的请求的方法必须是GET请求
@PostMapping:当前的请求必须是POST请求
@PutMapping("/login") //这个表示的是put方法的时候 会调用到这里来
@DeleteMapping("/login") //这个表示的是请求的方法必须是delete的时候才会被执行
- /**
- * 登陆的方法
- * @Title: login
- * @Description: TODO
- * @param: @return
- * @return: String
- * @throws
- */
- @RequestMapping(value="login",method=RequestMethod.GET)
- public String login(){
- System.out.println("这里是登陆的方法");
- return "/yuyu/yuyu1.jsp";
- }
-
- /**
- * 限定当前的方法只能post请求访问
- * @Title: register
- * @Description: TODO
- * @param: @return
- * @return: String
- * @throws
- */
- @RequestMapping(value="register",method=RequestMethod.POST)
- public String register(){
-
- System.out.println("这里是注册的方法");
-
- return "/index.jsp";
- }
- 复制代码
- /**
- * 返回页面的第一种方式 :直接返回一个页面
- * @Title: insert
- * @Description: TODO
- * @param: @return
- * @return: String
- * @throws
- */
- @RequestMapping("insert")
- public String insert(){
- System.out.println("我是部门的插入我执行了....");
- return "/index.jsp";
- }
-
- /**
- * 借助于ModelAndView来返回页面
- * @Title: insert
- * @Description: TODO
- * @param: @return
- * @return: String
- * @throws
- */
- @RequestMapping("insert1")
- public ModelAndView insert1(){
- ModelAndView modelAndView=new ModelAndView();
- modelAndView.setViewName("/index.jsp");
- System.out.println("我是部门的插入我执行了....");
- return modelAndView;
- }
-
- /**
- * 返回页面的第三种方式直接给个requset
- * @Title: insert2
- * @Description: TODO
- * @param: @param request
- * @param: @param response
- * @param: @throws ServletException
- * @param: @throws IOException
- * @return: void
- * @throws
- */
- @RequestMapping("insert2")
- public void insert2(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{
- System.out.println("我是部门的插入我执行了....");
- request.getRequestDispatcher("/index.jsp").forward(request, response);
- }
- /**
- * 重定向进行页面的跳转
- * @Title: insert3
- * @Description: TODO
- * @param: @return
- * @param: @throws ServletException
- * @param: @throws IOException
- * @return: String
- * @throws
- */
- @RequestMapping("insert3")
- public String insert3() throws ServletException, IOException{
- System.out.println("我是部门的插入我执行了....");
- return "redirect:/index.jsp";
- }
-
- /**
- * 通知消息转换器可以配置这个前缀和后缀
- * @Title: insert3
- * @Description: TODO
- * @param: @return
- * @param: @throws ServletException
- * @param: @throws IOException
- * @return: String
- * @throws
- */
- @RequestMapping("/insert4.action")
- public String insert4() throws ServletException, IOException{
- System.out.println("我是部门的插入我执行了....");
- return "index";
- }
- 复制代码
- /**
- * 第一种将数据放到域对象的方法
- * @Title: data
- * @Description: TODO
- * @param: @return
- * @return: String
- * @throws
- */
- @RequestMapping("data")
- public String data(Model model){
- model.addAttribute("userName","小羽1");
- System.out.println("我是部门的插入我执行了....");
- return "/index.jsp";
- }
-
- /**
- * 借助于ModelAndView来返回页面
- * @Title: data
- * @Description: TODO
- * @param: @return
- * @return: String
- * @throws
- */
- @RequestMapping("data1")
- public String data1(HttpServletRequest request){
- request.setAttribute("userName","小羽2");
- return "/index.jsp";
- }
-
- /**
- * 返回页面的第三种方式直接给个requset
- * @Title: data2
- * @Description: TODO
- * @param: @param request
- * @param: @param response
- * @param: @throws ServletException
- * @param: @throws IOException
- * @return: void
- * @throws
- */
- @RequestMapping("data2")
- public ModelAndView data2() throws ServletException, IOException{
- ModelAndView modelAndView=new ModelAndView();
- modelAndView.setViewName("/index.jsp");
- modelAndView.addObject("userName","小羽3");
- return modelAndView;
- }
- 复制代码
- /**
- * 第一种接受数据的方法
- * @Title: param1
- * @Description: TODO
- * @param: @param userName
- * @param: @param password
- * @param: @return
- * @return: String
- * @throws
- */
- @RequestMapping("parame1")
- public String param1(String userName,String password){
- System.out.println("接受到的数据是:"+userName+"----"+password);
- return "/index.jsp";
- }
-
- /**
- * 接受数组类型的数据
- * @Title: param1
- * @Description: TODO
- * @param: @param userName
- * @param: @param password
- * @param: @param habbit
- * @param: @return
- * @return: String
- * @throws
- */
- @RequestMapping("parame2")
- public String param2(String userName,String password,int[] habbit){
- System.out.println("接受到的数据是:"+userName+"----"+password);
- System.out.println(Arrays.toString(habbit));
- return "/index.jsp";
- }
-
- /**
- * 请求的参数自动封装(对象的属性必须和表单提交的name是一一对应的)
- * @Title: param3
- * @Description: TODO
- * @param: @param user
- * @param: @return
- * @return: String
- * @throws
- */
- @RequestMapping("parame3")
- public String param3(User user){
- System.out.println(user);
- return "/index.jsp";
- }
- 复制代码
11.2.1:编写封装类
- public class ManyUser {
-
- private List<User> users=new ArrayList<User>();
-
- public List<User> getUsers() {
- return users;
- }
-
- public void setUsers(List
users ) { - this.users = users;
- }
-
- @Override
- public String toString() {
- return "ManyUser [users=" + users + "]";
- }
- }
- 复制代码
11.2.2:参数的接受
- @RequestMapping("parame5")
- public String param5(ManyUser manyUser){
- System.out.println(manyUser.getUsers());
- return "/index.jsp";
- }
- 复制代码
11.2.3:编写jsp
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
-
- HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>My JSP 'param.jsp' starting pagetitle>
-
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="0">
- <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
- <meta http-equiv="description" content="This is my page">
-
- head>
-
- <body>
-
- 普通用户:
- <br>
- <form action="${pageContext.request.contextPath}/parame5.action"
- method="post">
- 用户名:<input type="text" name="users[0].userName"><br> 密码:<input
- type="password" name="users[0].password"><br> 你的爱好: 美女<input
- type="checkbox" name="users[0].habbit" value="1"> 帅哥<input
- type="checkbox" name="users[0].habbit" value="2"> 其他<input
- type="checkbox" name="users[0].habbit" value="3">
- <hr>
-
- 用户名:<input type="text" name="users[1].userName"><br> 密码:<input
- type="password" name="users[1].password"><br> 你的爱好: 美女<input
- type="checkbox" name="users[1].habbit" value="1"> 帅哥<input
- type="checkbox" name="users[1].habbit" value="2"> 其他<input
- type="checkbox" name="users[1].habbit" value="3">
- <hr>
-
- 用户名:<input type="text" name="users[2].userName"><br> 密码:<input
- type="password" name="users[2].password"><br> 你的爱好: 美女<input
- type="checkbox" name="users[2].habbit" value="1"> 帅哥<input
- type="checkbox" name="users[2].habbit" value="2"> 其他<input
- type="checkbox" name="users[2].habbit" value="3">
- <hr>
-
- <input type="submit" value="提交">
- form>
-
- body>
- html>
- 复制代码
11.3:当两个对象在同一个Controll中需要接受并且两个对象的属性是一样的时候的区分
- public class UserAndAdmin {
-
- private User user;
-
- private Admin admin;
-
- public User getUser() {
- return user;
- }
-
- public void setUser(User user) {
- this.user = user;
- }
-
- public Admin getAdmin() {
- return admin;
- }
-
- public void setAdmin(Admin admin) {
- this.admin = admin;
- }
-
- @Override
- public String toString() {
- return "UserAndAdmin [user=" + user + ", admin=" + admin + "]";
- }
-
- }
- 复制代码
- @RequestMapping("parame4")
- public String param4(UserAndAdmin userAndAdmin){
- System.out.println(userAndAdmin.getUser());
- System.out.println(userAndAdmin.getAdmin());
- return "/index.jsp";
- }
- 复制代码
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
-
- HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>My JSP 'param.jsp' starting pagetitle>
-
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="0">
- <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
- <meta http-equiv="description" content="This is my page">
-
- head>
-
- <body>
-
- 普通用户:
- <br>
- <form action="${pageContext.request.contextPath}/parame4.action"
- method="post">
- 用户名:<input type="text" name="user.userName"><br> 密码:<input
- type="password" name="user.password"><br> 你的爱好: 美女<input
- type="checkbox" name="user.habbit" value="1"> 帅哥<input
- type="checkbox" name="user.habbit" value="2"> 其他<input
- type="checkbox" name="user.habbit" value="3"> <input type="submit"
- value="提交">
- form>
-
- <hr>
- 管理员:
- <br>
- <form action="${pageContext.request.contextPath}/parame4.action"
- method="post">
- 用户名:<input type="text" name="admin.userName"><br> 密码:<input
- type="password" name="admin.password"><br> 你的爱好: 美女<input
- type="checkbox" name="admin.habbit" value="1"> 帅哥<input
- type="checkbox" name="admin.habbit" value="2"> 其他<input
- type="checkbox" name="admin.habbit" value="3"> <input type="submit"
- value="提交">
- form>
-
-
- body>
- html>
- 复制代码
- <filter>
- <filter-name>CharacterEncodingFilterfilter-name>
- <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
- <init-param>
- <param-name>encodingparam-name>
- <param-value>UTF-8param-value>
- init-param>
- filter>
-
- <filter-mapping>
- <filter-name>CharacterEncodingFilterfilter-name>
- <url-pattern>/*url-pattern>
- filter-mapping>
- 复制代码
SpringMVC的默认的访问后缀就是.action
Struts1.x的时代 默认的访问后缀是.do
Struts2.x+的时代也变成了.action