SSM(三) --- Spring MVC 框架的应用

一、Spring MVC web框架
-----------------------------------------


二、搭建tomcat服务器
-----------------------------------------
    1.下载并解压tomcat,注意解压路径下不要有中文或者空格
    2.启动tomcat服务器
        cmd tomcat/bin> startup.bat
    3.验证服务器是否启动成功
        http://localhost:8080/


三、tomcat的目录结构
---------------------------------------------
    1.bin
    2.conf       //配置文件
    3.webapps   //项目部署目录--可以将项目打成war包扔进去,运行期间自行解压
    4.work      //临时目录


四、在idea中开发web项目的准备工作
---------------------------------------------
    1.在idea中配置tomcat服务器
        settings > applications server 右侧 +:指定tomcat安装位置

    2.创建java模块 + javaEE支持 + maven支持.

    3.配置运行选项
        a.如果已经运行tomcat,请先停止
        b.run --> edit configuration --> + --> tomcat server
        c.Doployment --> + --> artifact --> *.war exploded
        d.配置热更新 Server选项卡--> VM options部分
            on "Update" action : update Classes and resources
            on Frame deactivation : update Classes and resources
    4.运行app


五、开发简单的web项目
-------------------------------------------
    1.添加依赖:在pom.xml引入springmvc的依赖
        
<?xml version="1.0" encoding="UTF-8"?>
        <project xmlns="http://maven.apache.org/POM/4.0.0"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>

            <groupId>com.it18zhang</groupId>
            <artifactId>myspringmvc</artifactId>
            <version>1.0-SNAPSHOT</version>
            <dependencies>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-webmvc</artifactId>
                    <version>4.3.3.RELEASE</version>
                </dependency>
            </dependencies>
        </project>

    2.配置分发器:在web/WEB-INF/web.xml文件中配置DispatcherServlet分发器.
        
<?xml version="1.0" encoding="UTF-8"?>
        <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
                 version="3.1">
            <!-- 配置分发器Servlet -->
            <servlet>
                <servlet-name>dispatcher</servlet-name>
                <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            </servlet>
            <servlet-mapping>
                <servlet-name>dispatcher</servlet-name>
                <url-pattern>/</url-pattern>
            </servlet-mapping>
        </web-app>

    3.配置handlermapping:配置springmvc驱动文件,使用注解驱动配置项(默认名称就是dispatcher-servlet.xml)
            [web/WEB-INF/dispatcher-servlet.xml]
         
   <?xml version="1.0" encoding="UTF-8"?>
            <beans xmlns="http://www.springframework.org/schema/beans"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xmlns:mvc="http://www.springframework.org/schema/mvc"
                   xsi:schemaLocation="http://www.springframework.org/schema/beans
                                    http://www.springframework.org/schema/beans/spring-beans.xsd
                                    http://www.springframework.org/schema/mvc
                                    http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">
                <!-- 使用注解驱动 -->
                <mvc:annotation-driven  />
            </beans>

    4.编写控制器类
        [HomeController.java]
        
package com.spring.controller;

        import org.springframework.stereotype.Controller;
        import org.springframework.web.bind.annotation.RequestMapping;

        /**
         * HomeControllor
         * @Controller 表示此类是控制器,scan时起作用
         */
        @Controller
        public class HomeController {

            /**
             * 打开主页
             * @RequestMapping({"/home"})
             * 处理以 /home 结尾的请求
             */
            @RequestMapping({"/home"})
            public String openHome()
            {
                System.out.println("open homepage");
                return "index";
            }

            /**
             * 打开index2页面
             * @RequestMapping({"/index2"})
             * 处理以 /index2 结尾的请求
             */
            @RequestMapping({"/index2"})
            public String openindex2()
            {
                System.out.println("open index2");
                return "index2";
            }
        }

    5.告知spring容器扫描注解:配置dispatcher-servlet.xml文件,增加扫描路径配置
        
<?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:mvc="http://www.springframework.org/schema/mvc"
               xmlns:context="http://www.springframework.org/schema/context"
               xsi:schemaLocation="http://www.springframework.org/schema/beans
                                        http://www.springframework.org/schema/beans/spring-beans.xsd
                                        http://www.springframework.org/schema/mvc
                                        http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
                                        http://www.springframework.org/schema/context
                                        http://www.springframework.org/schema/context/spring-context-4.3.xsd">
            <!-- 配置扫描路径 -->
            <context:component-scan base-package="com.spring.controller" />
            <!-- 使用注解驱动 -->
            <mvc:annotation-driven  />
        </beans>

    6.添加类库到打包输出路径 -- 解决 运行程序的时候,出现类找不到的原因。
        idea的web项目默认不会将依赖类库放置到web-inf/lib下,需要手动设置。
        project structure -> artifacts -> myspringmvc:war exploded -> 选择 output layout选项卡 ->
        选择右侧的available elements下myspringmvc条目的所有类库 ->右键 -> put into WEB-INF/lib即可。

    7.启动程序,访问地址
          http://localhost:8080/

    8.配置Spring MVC是视图解析器.
        [web/WEB-INF/dispatcher-servlet.xml]
        
<?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:mvc="http://www.springframework.org/schema/mvc"
               xmlns:context="http://www.springframework.org/schema/context"
               xsi:schemaLocation="http://www.springframework.org/schema/beans
                                http://www.springframework.org/schema/beans/spring-beans.xsd
                                http://www.springframework.org/schema/mvc
                                http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
                                http://www.springframework.org/schema/context
                                http://www.springframework.org/schema/context/spring-context-4.3.xsd">
            <!-- 配置扫描路径 -->
            <context:component-scan base-package="com.it18zhang.springmvc.web.controller" />
            <!-- 使用注解驱动 -->
            <mvc:annotation-driven  />

            <!-- 内部资源视图解析器 -->
            <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <!-- prefix + controller return + suffix-->
                <!-- 前缀 + 控制器返回值 + 后缀 -->
                <!-- / index .jsp -->
                <property name="prefix" value="/" />
                <property name="suffix" value=".jsp"/>
            </bean>
        </beans>

    9.启动程序,访问地址
        http://localhost:8080/home/
        http://localhost:8080/index2/


六、html
-----------------------------------------------------------
    1.inline行内标签
        标签自己不占一行,和其他标签共处一行。如果想换行,需要加<br>

    2.block块标签
        标签自己占用一行


七、web项目 -- 实现用户注册功能
----------------------------------------------------
    1.在创建/web/下创建regist.jsp页面
    [/web/regist.jsp]
        
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
        <html>
        <head>
            <title>regist.jsp</title>
        </head>
        <body>
        <form>
            UserName : <input type="text" name="username" ><br>
            Password : <input type="password" name="password" ><br>
            <input type="submit" name="submit">
        </form>
        </body>
        </html>

    2.添加maven依赖,引入Servlet API类库
        [pom.xml]
        
<?xml version="1.0" encoding="UTF-8"?>
        <project xmlns="http://maven.apache.org/POM/4.0.0"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>

            <groupId>groupId</groupId>
            <artifactId>SpringMVC</artifactId>
            <version>1.0-SNAPSHOT</version>

            <dependencies>

                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-webmvc</artifactId>
                    <version>4.3.3.RELEASE</version>
                </dependency>
                <dependency>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                    <version>2.5</version>
                </dependency>

            </dependencies>


        </project>


    3.给from添加超链接 -- 采用post的方式链接到@Controller 的 @Mapping "/doRegist2"
     [/web/regist.jsp]
        
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
        <html>
        <head>
            <title>regist.jsp</title>
        </head>
        <body>
        <!-- jsp页面给控制器传递参数 -->
        <form action="/doRegist2" method="post" >
            UserName : <input type="text" name="username" ><br>
            Password : <input type="password" name="password" ><br>
            <input type="submit" name="submit">
        </form>
        </body>
        </html>

    4.新建类RegistController.class -- 两种方式获取回传的用户名和密码
    --------------------------------------------------------
       
 package com.spring.controller;

        import org.springframework.stereotype.Controller;
        import org.springframework.web.HttpRequestHandler;
        import org.springframework.web.bind.annotation.RequestMapping;
        import org.springframework.web.bind.annotation.RequestParam;

        import javax.servlet.http.HttpServletRequest;

        @Controller
        public class RegistControllor {

            /**
             * 打开注册页面
             */
            @RequestMapping({"/regist"})
            public String registPage()
            {
                return "regist";
            }


            /**
             * 处理注册信息
             */
            @RequestMapping({"/doRegist1"})
            public String doRegist1(HttpServletRequest request)
            {
                String username = request.getParameter("username");
                String password = request.getParameter("password");
                System.out.println(username + ":" + password);
                return "index";
            }

            /**
             * 处理注册信息
             */
            @RequestMapping({"/doRegist2"})
            public String doRegist2(@RequestParam("username") String username, @RequestParam("password") String password)
            {
                System.out.println(username + "--" + password);
                return "index";
            }

        }


八、动态获取上下文(根目录) Controller向jsp传递参数 -- 引入jstl标签库,jee标准标签库
--------------------------------------------------------------------
    1.达到动态获取项目名称[上下文],然后作为参数传递给jsp,解决随意更改项目名称的问题

    2.添加maven依赖
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

    3.修改jsp页面,声明标签库并使用标签
        
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
        <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
        <html>
        <head>
            <title>reg.jsp</title>
        </head>
        <body>
        <!-- 动态提取标签的上下文 -->
        <form action='<c:url value="/reg.jsp" />' method="post">
            UserName : <input type="text" name="username"><br>
            Password : <input type="password" name="password"><br>
            <input type="submit"/>
        </form>
        </body>
        </html>

九、模拟查询一个User对象 -- 控制器给jsp页面传递参数by Model
------------------------------------------------------------------
    1.添加控制器方法
     
 /**
       * 模拟查询用户信息
       * 通过model向jsp页面传值
       */
      @RequestMapping("/selectOne")
      public String selectOne(Model model, @RequestParam("uid") int uid)
      {
          System.out.println("uid = " + uid);
          String username = "tomson";
          model.addAttribute("myusername", username);
          return "selectOne";
      }

    2.编写selectOne.jsp
       
 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
        <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
        <html>
            <head>
                <title>selectOne.jsp</title>
            </head>
            <body>
                username : <c:out value="${myusername}" />
            </body>
        </html>

    3.运行,并打开浏览器,输入网址:http://localhost:8080/selectOne?uid=100


十、模拟查询user列表
----------------------------------------------------------------------
    1.新建User类
    -------------------------------
      
  package com.spring.domain;

        /**
         * 用户java bean
         */
        public class User {
            private Integer id;
            private String name;
            private int age;

            public Integer getId() {
                return id;
            }

            public void setId(Integer id) {
                this.id = id;
            }

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }

            public int getAge() {
                return age;
            }

            public void setAge(int age) {
                this.age = age;
            }
        }

    2.添加控制器方法
        
/**
         * 查询全部
         */
        @RequestMapping("/selectAll")
        public String selectAll(Model model)
        {
            List<User> userList = new ArrayList<User>();
            for (int i = 1; i <= 50 ; i++) {
                User u = new User();
                u.setId(i);
                u.setAge(i % 20);
                u.setName("tom" + i);
                userList.add(u);
            }
            model.addAttribute("allUsers", userList);
            return "userList";
        }


    3.创建userList.jsp界面
       
 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
        <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
        <html>
            <head>
                <title>selectOne.jsp</title>
            </head>
            <body>
                <table border="1px">
                    <tr>
                        <td>ID</td>
                        <td>NAME</td>
                        <td>AGE</td>
                    </tr>
                    <c:forEach items="${allUsers}" var="u">
                        <tr>
                            <td><c:out value="${u.id}"/>
                            <td><c:out value="${u.name}"/>
                            <td><c:out value="${u.age}"/>
                        </tr>
                    </c:forEach>
                </table>
            </body>
        </html>

    4.启动服务器,输入地址http://localhost:8080/selectAll


十一、forward 请求转发 -- 一个控制器转发请求到另一个控制器
---------------------------------------------------------------
    1.请求转发,在服务器内部完成,客户端不参与。虽然内容改变,但是界面还是原来的界面,并没有跳转到新的界面
    2.地址栏不改变,如果刷新界面,很可能导致重复提交。
    3.只能转发到本应用的其他控制器映射上。
    4.共享请求参数


十二、redirect 重定向 -- 一个控制器转发请求到另一个控制器,但是不带数据
-------------------------------------------------------------------
    1.模拟服务器重新发送请求,打开新的界面,相当于完全打开了一个新的页面。跳转到了一个新的界面
    2.重定向,客户端参与,地址栏变,可以重定向到任意url地址。
    3.不能共享变量。
    4.不会导致重复提交


十三、模拟完成数据库的CRUD
----------------------------------------------------------------
    1.编写控制器
    ------------------------------------
      
 package com.spring.controller;

       import com.spring.domain.User;
       import org.springframework.stereotype.Controller;
       import org.springframework.ui.Model;
       import org.springframework.web.HttpRequestHandler;
       import org.springframework.web.bind.annotation.RequestMapping;
       import org.springframework.web.bind.annotation.RequestParam;

       import javax.servlet.http.HttpServletRequest;
       import java.util.ArrayList;
       import java.util.List;

       @Controller
       public class RegistControllor {

           public static List<User> userList = new ArrayList<User>();
           static {
               for (int i = 1; i <= 50 ; i++) {
                   User u = new User();
                   u.setId(i);
                   u.setAge(i % 20);
                   u.setName("tom" + i);
                   userList.add(u);
               }
           }

           /**
            * 打开注册页面
            */
           @RequestMapping({"/regist"})
           public String registPage()
           {
               return "regist";
           }


           /**
            * 处理注册信息
            */
           @RequestMapping({"/doRegist1"})
           public String doRegist1(HttpServletRequest request)
           {
               String username = request.getParameter("username");
               String password = request.getParameter("password");
               System.out.println(username + ":" + password);
               return "index";
           }

           /**
            * 处理注册信息
            */
           @RequestMapping({"/doRegist2"})
           public String doRegist2(@RequestParam("username") String username, @RequestParam("password") String password)
           {
               System.out.println(username + "--" + password);
               return "index";
           }

           /**
            * 模拟查询用户信息
            * 通过model向jsp页面传值
            */
           @RequestMapping("/selectOne")
           public String selectOne(Model model, @RequestParam("uid") int uid)
           {
               System.out.println("uid = " + uid);
               String username = DB.select(uid).getName();
               model.addAttribute("myusername", username);
               return "selectOne";
           }

           /**
            * 查询全部
            */
           @RequestMapping("/selectAll")
           public String selectAll(Model model)
           {
               model.addAttribute("allUsers", DB.findAll());
               return "userList";
           }

           /**
            * 删除一个用户
            */
           @RequestMapping("/deleteOne")
           public String deleteOne(@RequestParam("uid") int uid)
           {
               System.out.println("删除用户" + uid);
               DB.delete(uid);

               return "redirect:/selectAll";
           }

           @RequestMapping("/editOne")
           public String editOne(Model model , @RequestParam("uid") int uid)
           {
               User u = DB.select(uid);
               model.addAttribute("user", u);
               return "editUser";
           }

           @RequestMapping("/updateOne")
           public String updateOne(User user)
           {
               DB.update(user);
               return "redirect:/selectAll";
           }
       }

    2.模拟数据库类
    --------------------------------------
        
package com.spring.controller;

        import com.spring.domain.User;

        import java.util.ArrayList;
        import java.util.HashMap;
        import java.util.List;
        import java.util.Map;

        public class DB {

            public static Map<Integer,User> tables = new HashMap<Integer, User>();
            static{
                for(int i = 1 ; i <= 15 ; i ++){
                    User u = new User();
                    u.setId(i);
                    u.setName("tom" + i);
                    u.setAge(i % 20);
                    tables.put(i,u) ;
                }
            }

            /**
             *查询全部
             */
            public static List<User> findAll(){
                return new ArrayList<User>(tables.values());
            }

            /**
             * 删除
             */
            public static void delete(Integer uid){
                tables.remove(uid);
            }

            public static User select(Integer uid){
                return tables.get(uid);
            }

            /**
             * 更新
             */
            public static void update(User user){
                tables.put(user.getId(),user) ;
            }

            /**
             * 删除全部
             */
            public static void deleteAll(){
                tables.clear();
            }

        }


    3.编写index.jsp界面
        
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
        <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
        <html>
          <head>
            <title>$Title$</title>
          </head>
          <body>
          欢迎xxxxxx!!!
          <a href="<c:url value="/selectAll"></c:url>"> 查询全部用户信息 </a>
          </body>
        </html>

    4.编写显示所有用户列表界面userList.jsp
       
 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
        <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
        <html>
            <head>
                <title>selectOne.jsp</title>
            </head>
            <body>
                <table border="1px">
                    <tr>
                        <td>ID</td>
                        <td>NAME</td>
                        <td>AGE</td>
                        <td>删除</td>
                        <td>修改</td>
                    </tr>
                    <c:forEach items="${allUsers}" var="u">
                        <tr>
                            <td><c:out value="${u.id}"/>
                            <td><c:out value="${u.name}"/>
                            <td><c:out value="${u.age}"/>
                            <td><a href="<c:url value="/deleteOne?uid=${u.id}"/>">删除</a></td>
                            <td><a href="<c:url value="/editOne?uid=${u.id}"/>">修改</a></td>
                        </tr>
                    </c:forEach>
                </table>
            </body>
        </html>

    5.编写更新用户界面editUser.jsp
       
 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
        <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
        <html>
            <head>
                <title>editUser.jsp</title>
            </head>
            <body>
                <form action='<c:url value="/updateOne" />' method="post">
                    id   : <input type="hidden" name="id" value="<c:out value="${user.id}"/>"><br>
                    name : <input type="text" name="name" value="<c:out value="${user.name}"/>"><br>
                    age  : <input type="text" name="age" value="<c:out value="${user.age}"/>"><br>
                    <input type="submit" value="修改"/>
                </form>
            </body>
        </html>

    6.运行app







猜你喜欢

转载自blog.csdn.net/xcvbxv01/article/details/83110725