搭建SpringMVC详解

一、 创建一个web项目

  1. 新建一个Dynamic Web Project项目,版本选择2.5
  2. 删除Java Sources中的src文件夹,新建如下四个资源文件夹:
    搭建SpringMVC详解
  3. 拷入如下所示的jar包:
    搭建SpringMVC详解

二、 配置文件

  1. 打开web.xml文件,删去无用代码,创建Spring容器并向其中添加对象。
    搭建SpringMVC详解
  2. 在src/main/resource中创建一个名字为application.xml的Spring Bean Configuration File文件
    搭建SpringMVC详解
  3. 在application.xml的页面下方点击namespace进行如下勾选:
    搭建SpringMVC详解
  4. 在application.xml中配置扫描器和调用默认servlet的代码
    搭建SpringMVC详解 对以上操作中的解释
    1. src/test/java、src/test/resource、src/main/java、src/main/resource
      src/test/java:存放测试代码
      src/test/resource:存放测试资源文件
      src/main/java:存放源程序核心代码
      src/main/resource:存放源程序资源文件

    2. web.xml文件配置

      1. DispatcherServlet路径名由来
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        右击如下所示的DispatcherServlet文件,选择Copy Qualified Name
        搭建SpringMVC详解

      2. 写在DispatcherServlet中,代表当Tomcat启动时此Servlet调用init()方法,加载application.xml,产生一个Spring容器,并且开始扫描,将对象放入容器中。

        ContextConfigLocation classpath:application.xml
      3. 代表在服务器启动时创建Servlet对象。

          <load-on-startup>1</load-on-startup>
        
      4. 加上"/"代表此Servlet拦截所有请求。

          <url-pattern>/</url-pattern>
        
    3. application.xml文件配置

      1. 指定base-package开始的包自动实例化,注意:包内类必须添加有 Controller、Service、Component类注解

        <context:component-scan base-package="com.zzu"></context:component-scan>
        
      2. 如果请求没有任何一个Controller中的某一个方法处理,则交给Web服务器默认Servlet处理。

         <mvc:default-servlet-handler/>
         <mvc:annotation-driven></mvc:annotation-driven>
        
    4. 逻辑

      • load-on-startup:服务器启动时创建Servlet对象
      • 请求被DispacherServlet拦截,并调用init()方法,获取contextConfigLocation变量的值:classpath:application.xml,经过处理调用application.xml文件,创建Spring容器+实例化类。
      • 若该类中含有@controller注解,则将该类中方法上@RequestMapping中的value值添加到Map集合中
      • 任何一个请求过来,就与Map集合中的已有的Servlet匹配
      • 如果在Map集合中没找到,不用等待,就用默认Servlet处理。

三、创建模块

  1. 在src/main/java中添加一个package,名字叫做com.jd.userinfo,在其中添加一个UserInfoCotroller类,代码如图所示:
    搭建SpringMVC详解

  2. 在Web Content/WEB-INF文件夹下新建文件夹view,并新建两个jsp文件:login.jsp和success.jsp
    (因为WEB-INF中存放的数据最安全,只能用请求转发方式访问)
    (报错是因为缺少servlet包,导入jar包即可)
    搭建SpringMVC详解

  3. 在application.xml文件中写入如下代码:
    搭建SpringMVC详解

  4. 在WebContent目录下创建一个index.jsp,再在com.zzu.index包下创建一个IndexController类
    index.jsp中代码如下
    搭建SpringMVC详解
    IndexController中代码如下
    搭建SpringMVC详解

  5. 修改login.jsp中的代码如下:
    搭建SpringMVC详解

  6. 修改success.jsp使其显示OK

  7. 此时发布项目,访问http://127.0.0.1:8080/test会出现如下登陆页面网页
    输入用户名密码后会显示OK。
    搭建SpringMVC详解
    搭建SpringMVC详解
    但此时会发现网址栏显示出用户名和密码,是因为from表单默认调用GET方法。
    所以在login.jsp页面中修改from表单调用POST方法

     <form action="${path }userinfo/login.do" method="post">
    

    并修改UserInfoController类中的RequestMapping注解如下

     @RequestMapping(value="/userinfo/login.do",method=RequestMethod.POST)
    

四、搭建框架

  1. 如图所示,创建工具类与数据库连接
  2. 创建userinfo中的Dao层和Service层,实现登陆
  3. 在UserInfoController.java中进行处理
  4. 创建fail.jsp文件,当登录失败时返回的页面
    搭建SpringMVC详解
  • IUserInfoService 中的代码

     package com.zzu.userinfo;
     
     public interface IUserInfoService {
     	
     	public boolean login(String userName, String password);
     }
    
  • UserInfoService 中的代码

     package com.zzu.userinfo.imp;
     
     import org.springframework.beans.factory.annotation.Autowired;
     import org.springframework.stereotype.Service;
     
     import com.zzu.userinfo.IUserInfoDao;
     import com.zzu.userinfo.IUserInfoService;
     
     @Service
     public class UserInfoService implements IUserInfoService {
     
     	@Autowired
     	private IUserInfoDao userInfoDao;	
     	
     	public boolean login(String userName, String password) {
     		return userInfoDao.login(userName, password); 
     	}
     	
     }
    
  • IUserInfoDao 中的代码

     package com.zzu.userinfo;
     
     public interface IUserInfoDao {
     
     	public boolean login(String userName, String password);
     }
    
  • UserInfoDao 中的代码

      package com.zzu.userinfo.imp;
      
      import java.sql.ResultSet;
      import java.sql.SQLException;
      
      import org.springframework.stereotype.Repository;
      
      import com.zzu.tool.db.DBTool;
      import com.zzu.tool.db.IRowMapper;
      import com.zzu.userinfo.IUserInfoDao;
      
      @Repository
      public class UserInfoDao implements IUserInfoDao {
      
      	public boolean login(String userName, String password) {
      		String sql = "select * from user_info where user_name = ? and password = ?";
      		class RowMapper implements IRowMapper{
      			boolean state;
      			
      			public void rowMapper(ResultSet resultSet) {
      				try {
      					if(resultSet.next()) {
      						state = true;
      					}
      				} catch (SQLException e) {
      					e.printStackTrace();
      				}
      			}
      		}
      		RowMapper rowMapper = new RowMapper();
      		DBTool.select(sql, rowMapper, userName, password);
      		return rowMapper.state;
      	}
      }
    
  • UserInfoController中的代码

     package com.zzu.userInfo;
     
     import javax.servlet.http.HttpServletRequest;
     
     import org.springframework.beans.factory.annotation.Autowired;
     import org.springframework.stereotype.Controller;
     import org.springframework.web.bind.annotation.RequestMapping;
     import org.springframework.web.bind.annotation.RequestMethod;
     
     
     @Controller
     public class UserInfoController {
     
     	@Autowired
     	private IUserInfoService userInfoService;
     	
     	@RequestMapping(value = "userinfo/login.do",method=RequestMethod.POST)
     	public String login(String userName, String password, HttpServletRequest request) {
     		System.out.println(userName+":"+password);
     		if(userInfoService.login(userName, password)) {
     			request.getSession().setAttribute("userName", userName);
     			return "success";
     		}
     		return "fail";
     	}
     }