1、項目結構及依賴包javascript
2、建庫php
-- phpMyAdmin SQL Dump -- version 4.6.4 -- https://www.phpmyadmin.net/ -- -- Host: localhost -- Generation Time: 2017-12-27 13:44:25 -- 服務器版本: 5.7.14 -- PHP Version: 5.6.26 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00"; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8mb4 */; -- -- Database: `test` -- -- -------------------------------------------------------- -- -- 表的結構 `t_user` -- CREATE TABLE `t_user` ( `userId` int(11) NOT NULL, `userName` varchar(20) DEFAULT NULL, `password` varchar(20) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- -- 轉存表中的數據 `t_user` -- INSERT INTO `t_user` (`userId`, `userName`, `password`) VALUES (1, 'wxw1', '123'), (3, 'wxw3', '123'), (4, 'wxw4', '4444'), (8, 'wxw8', '1234'), (2, '王弈偉', '123'); -- -- Indexes for dumped tables -- -- -- Indexes for table `t_user` -- ALTER TABLE `t_user` ADD PRIMARY KEY (`userId`), ADD UNIQUE KEY `userName` (`userName`,`password`); -- -- 在導出的表使用AUTO_INCREMENT -- -- -- 使用表AUTO_INCREMENT `t_user` -- ALTER TABLE `t_user` MODIFY `userId` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=9; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
3、DAO實現css
只貼代碼不作解釋,不清楚的請移步Spring 的持久化實例和Spring Mybatis實例SqlSessionDaoSupport混用xml配置和註解。html
實體pojojava
package test.SpringMVC.model; public class TUser { private long userId; private String userName; private String password; public long getUserId() { return userId; } public void setUserId(long userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "TUser [userId=" + userId + ", userName=" + userName + ", password=" + password + "]"; } }
接口mysql
package test.SpringMVC.dao; import java.util.List; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; import test.SpringMVC.model.TUser; public interface ITUserDao { @Select("select * from t_user") public List<TUser> listAll(); @Select("select * from t_user where userId=#{userId}") public TUser getById(long userId); @Insert("insert into t_user(userId,userName,password) values(#{userId}, #{userName}, #{password})") public int insert(TUser u); @Update("update t_user set userName=#{userName},password=#{password} where userId=#{userId}") public int update(TUser u); @Delete("delete from t_user where userId=#{userId}") public int deleteById(long userId); @Select("delete from t_user") public void delAllUser(); @Select("select * from t_user where userName=#{userName} and password=#{password}") public TUser CheckLoginAndPwd(@Param("userName") String userName,@Param("password") String password); }
接口實現:jquery
package test.SpringMVC.daoimpl; import java.util.List; import org.mybatis.spring.support.SqlSessionDaoSupport; import test.SpringMVC.dao.ITUserDao; import test.SpringMVC.model.TUser; public class TUserDaoImpl extends SqlSessionDaoSupport implements ITUserDao { @Override public List<TUser> listAll() { // TODO 自動生成的方法存根 return this.getSqlSession().getMapper(ITUserDao.class).listAll(); } @Override public TUser getById(long userId) { // TODO 自動生成的方法存根 return this.getSqlSession().getMapper(ITUserDao.class).getById(userId); } @Override public int insert(TUser u) { // TODO 自動生成的方法存根 return this.getSqlSession().getMapper(ITUserDao.class).insert(u); } @Override public int update(TUser u) { // TODO 自動生成的方法存根 return this.getSqlSession().getMapper(ITUserDao.class).update(u); } @Override public int deleteById(long userId) { // TODO 自動生成的方法存根 return this.getSqlSession().getMapper(ITUserDao.class).deleteById(userId); } @Override public TUser CheckLoginAndPwd(String userName, String password) { // TODO 自動生成的方法存根 return this.getSqlSession().getMapper(ITUserDao.class).CheckLoginAndPwd(userName, password); } @Override public void delAllUser() { // TODO 自動生成的方法存根 this.getSqlSession().getMapper(ITUserDao.class).delAllUser(); } }
4、配置文件web
web.xml配置了首頁index.jsp,其它的請求都被spring攔截ajax
<?xml version="1.0" encoding="UTF-8"?> <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_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>spring mvc</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!--configure the setting of springmvcDispatcherServlet and configure the mapping --> <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:springmvc-servlet.xml</param-value> </init-param> <!-- <load-on-startup>1</load-on-startup> --> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
springmvc-servlet.xml配置了數據源、mybatis配置文件路徑、靜態資源放行,須要說明的是攔截器Myinterceptor實現了HandlerInterceptor接口,其中postHandle對未處於登陸狀態的請求進行攔截,強制跳轉到登陸頁面user/Login.jsp,後面給出代碼。spring
<?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:context="http://www.springframework.org/schema/context" 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/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd"> <!-- scan the package and the sub package --> <context:component-scan base-package="test.SpringMVC"/> <!-- 解除servlet對靜態資源文件訪問的限制,使得靜態資源先通過 --> <!-- <mvc:default-servlet-handler /> --> <mvc:resources mapping="/js/**" location="/js/"/> <mvc:resources mapping="/css/**" location="/css/"/> <!-- if you use annotation you must configure following setting --> <mvc:annotation-driven /> <!-- 攔截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <mvc:exclude-mapping path="/**/*.js"/> <mvc:exclude-mapping path="/**/*.css"/> <bean class="test.SpringMVC.controller.Myinterceptor"></bean> </mvc:interceptor> </mvc:interceptors> <!-- configure the InternalResourceViewResolver --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <!-- 前綴 --> <property name="prefix" value="/WEB-INF/jsp/" /> <!-- 後綴 --> <property name="suffix" value=".jsp" /> </bean> <bean id="dataSource1" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false" /> <property name="username" value="your-user" /> <property name="password" value="your-passwd" /> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource1" /> <property name="configLocation" value="classpath:test/SpringMVC/dao/mybatis-cfg.xml" /> </bean> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg ref="sqlSessionFactory" /> </bean> <bean id="TUserDao" class="test.SpringMVC.daoimpl.TUserDaoImpl"> <property name="sqlSessionTemplate" ref="sqlSession" /> </bean> </beans>
mybatis配置mybatis-cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <typeAliases> <typeAlias alias="TUser" type="test.SpringMVC.model.TUser" /> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://127.0.0.1:3306/test?useSSL=false" /> <property name="username" value="your-user" /> <property name="password" value="your-passwd" /> </dataSource> </environment> </environments> <mappers> <!--接口的方式 註冊接口--> <mapper class="test.SpringMVC.dao.ITUserDao"/> </mappers> </configuration>
5、控制器
package test.SpringMVC.controller; import java.util.List; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.ComponentScan; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.ModelAndView; import test.SpringMVC.dao.ITUserDao; import test.SpringMVC.model.TUser; @RestController @ComponentScan("test.SpringMVC.*") @RequestMapping("/user") public class UserController { @Autowired @Qualifier("TUserDao") ; private ITUserDao iservice; @RequestMapping(value="/checkLogin",produces = {"application/json;charset=UTF-8" }) public @ResponseBody TUser checkLogin(@RequestBody TUser user,Model model,HttpSession session){ TUser user1=iservice.CheckLoginAndPwd(user.getUserName(), user.getPassword()); session.setAttribute("user1", user1); return user1; } @RequestMapping(value = "/ulist", method = RequestMethod.GET) public ModelAndView getUsers() { List<TUser> ulist = iservice.listAll(); ModelAndView modelAndView = new ModelAndView("user/userslist");// 轉到/WEB-INF/jsp/user/userslist.jsp modelAndView.addObject("userslist", ulist); return modelAndView; } @RequestMapping(value="/register",method={RequestMethod.GET,RequestMethod.POST}) public ModelAndView register(@ModelAttribute TUser user,Model model){ ModelAndView modelAndView = new ModelAndView("user/regsuccess");// 轉到/WEB-INF/jsp/user/regsuccess.jsp if(iservice.CheckLoginAndPwd(user.getUserName(), user.getPassword())!=null||iservice.getById(user.getUserId())!=null){ model.addAttribute("msg", "註冊失敗:id不能重複,用戶名密碼不能都同樣!");// 失敗也是轉到user/regsuccess.jsp這個頁面只是顯示不同信息 return modelAndView; } model.addAttribute("msg", "註冊成功"); iservice.insert(user); return modelAndView; } @RequestMapping("/LogOut") public ModelAndView LogOut(HttpSession session){ session.invalidate(); ModelAndView modelAndView = new ModelAndView("user/Login");// 轉到/WEB-INF/jsp/user/Login.jsp return modelAndView; } @RequestMapping(value = "/saveUser",produces = "text/html;charset=UTF-8") public void saveUser(TUser u){ iservice.insert(u); } @RequestMapping("/delUser") public void delUser(int id){ iservice.deleteById(id); } @RequestMapping("/updateUser") public void updateUser(TUser u){ iservice.update(u); } @RequestMapping("/userlist.json") public @ResponseBody List<TUser> getUserList() { return iservice.listAll(); } @RequestMapping("/toaddform") public ModelAndView toaddform() { ModelAndView modelAndView = new ModelAndView("user/userform");// 轉到/WEB-INF/jsp/user/userform.jsp return modelAndView; } }
使用@RestController註解等於使用@Controller和@ResponseBody兩個註解,標識該類是Spring MVC controller處理器,而且把返回結果直接寫入HTTP response body中。因此返回String沒有被解析爲跳轉路徑,而是直接把字符串的內容顯示到頁面上。如返回String須要跳轉則用@Controller註解。
6、攔截器Myinterceptor
package test.SpringMVC.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import test.SpringMVC.model.TUser; public class Myinterceptor implements HandlerInterceptor { @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { // TODO 自動生成的方法存根 } @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { // TODO 自動生成的方法存根 } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object hander) throws Exception { // TODO 自動生成的方法存根 String url=request.getRequestURI(); if(url.indexOf("/checkLogin.action")>=0){ return true; } if(url.indexOf("/register.action")>=0) { return true; } HttpSession session=request.getSession(); TUser user=(TUser)session.getAttribute("user1"); if(user!=null){ return true; } request.getRequestDispatcher("/WEB-INF/jsp/user/Login.jsp").forward(request, response); return false; } }
7、頁面代碼:
首頁index.jsp:一個菜單列表,以及用bootstrap實現了右上角登陸標誌,登陸狀態就顯示用戶名,點擊註銷會經過/LogOut RequestMapping轉到Login.jsp叫用戶從新登陸
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="stylesheet" href="css/bootstrap.min.css" /> <script type="text/javascript" src="js/bootstrap.min.js"></script> <title>Insert title here</title> </head> <body> <!-- 標題 --> <div class="row"> <div class="col-md-7"> <h1>菜單列表</h1> </div> <div class="col-md-offset-10"> <h4>歡迎您:<span class="glyphicon glyphicon-user"></span> <strong>${user1.userName}</strong> <small><a href="${pageContext.request.contextPath }/user/LogOut.action">註銷</a></small></h4> </div> </div> <ul> <li><a href="user/ulist.do">t_user數據庫頁面</a></li> <li><a href="user/toaddform.do">註冊新t_user</a></li> </ul> </body> </html>
user/Login.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'Login.jsp' starting page</title> <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"> <link rel="stylesheet" href="css/bootstrap.min.css" /> <link rel="stylesheet" href="css/bootstrap-datetimepicker.min.css" /> <script type="text/javascript" src="js/jquery-3.2.1.min.js"></script> <script type="text/javascript" src="js/bootstrap.min.js"></script> <script type="text/javascript" src="js/bootstrap-datetimepicker.min.js"></script> <script type="text/javascript" src="js/bootstrap-datetimepicker.zh-CN.js"></script> </head> <style> </style> <script type="text/javascript"> $("#myModal").modal({ keyboard : false, backdrop : false }); $(function() { $("#lo") .click( function() { $ .ajax({ type : 'post', url : '${pageContext.request.contextPath}/user/checkLogin.action', contentType : 'application/json;charset=utf-8', data : JSON.stringify({ "userName" : $("#loginusername") .val(), "password" : $("#loginpassword") .val() }), success : function(data) { if (data == "" || data == null) { $("#message").html("用戶名或密碼錯誤"); } else { window.location.href = "${pageContext.request.contextPath}/index.jsp"; //登陸成功後轉主頁面 } } }); }); }); </script> <style> #login { width: 450px; height: 100px; margin: 50px auto; } </style> <body> <div class="container"> <div id="login"> <form class="form-horizontal" role="form"> <div class="form-group"> <label for="inputEmail3" class="col-sm-2 control-label">用戶名</label> <div class="col-sm-10"> <input type="text" class="form-control" id="loginusername" name="userName" placeholder="請輸入您的用戶名" required autofocus> </div> </div> <div class="form-group"> <label for="inputPassword3" class="col-sm-2 control-label">密碼</label> <div class="col-sm-10"> <input type="password" class="form-control" id="loginpassword" name="password" placeholder="請輸入您的密碼" required> <label class="control-label" for="inputSuccess1" style="color: red;" id="message"></label> </div> </div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> <button type="button" class="btn btn-info" id="lo">登錄</button> <button type="button" class="btn btn-danger" data-toggle="modal" data-target="#myModal">點擊註冊新用戶</button> </div> </div> </form> <!-- 註冊模態框 --> <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal"> <span aria-hidden="true">×</span><span class="sr-only">Close</span> </button> <h4 class="modal-title" id="myModalLabel">用戶註冊</h4> </div> <form class="form-horizontal" role="form" action="${pageContext.request.contextPath}/user/register.action" method="post" id="form"> <div class="modal-body"> <!-- 表單 --> <div class="form-group"> <label for="inputEmail3" class="col-sm-3 control-label">用戶名</label> <div class="col-sm-6"> <input type="text" class="form-control" id="userName" name="userName" placeholder="請輸入您的用戶名" required autofocus> </div> </div> <div class="form-group"> <label for="inputPassword3" class="col-sm-3 control-label">密碼</label> <div class="col-sm-6"> <input type="password" class="form-control" id="password" name="password" placeholder="請輸入您的密碼" required autofocus> </div> </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">關閉</button> <button type="submit" class="btn btn-primary" id="save">註冊</button> </div> </form> </div> </div> </div> </div> </div> </body> </html>
user/userform.jsp springmvc表單處理的例子用於註冊新用戶
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Spring MVC表單處理</title> </head> <body> <h2>User Information</h2> <form action="${pageContext.request.contextPath}/user/register" method="post"> 編號:<input type="text" name="userId"/> 用戶名:<input type="text" name="userName"/> 密碼:<input type="text" name="password"/> <input type="submit" value="提交"/> </form> </body> </html>
註冊後轉到regsuccess.jsp顯示信息
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'success.jsp' starting page</title> <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> <h1>${msg }</h1> </body> </html>
userslist.jsp用於顯示t_user表的內容
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <title>JSP顯示用戶</title> </head> <body> <table border="1"> <tr> <th>編號</th> <th>名字</th> <th>密碼</th> </tr> <c:forEach items="${userslist}" var="users"> <tr> <td>${users.userId}</td> <td>${users.userName}</td> <td>${users.password}</td> </tr> </c:forEach> </table> </body> </html>
8、運行截圖:
未登陸時點擊菜單的條目都會轉到登陸頁面
登陸後會轉到首頁,再點擊t_user數據庫頁面就會顯示t_user表的內容
新增用戶表單頁面