1. 程式人生 > >springMVC使用者登入例項(二)

springMVC使用者登入例項(二)

1.web.xml

<?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>02_spring_mvc_user</display-name>
  
   <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>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  
  <!-- springMVC 1.建立servlet -->
  <servlet>
  	<!-- 需要在WEB-INF下面建立對應的hello-servlet.xml -->
  	<servlet-name>user</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	<load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  	<servlet-name>user</servlet-name>
  	<!-- 捕獲所有請求,基於rest -->
  	<url-pattern>/</url-pattern>
  </servlet-mapping>
  
  
  <!-- 
  		OS(OpenSymphony)的SiteMesh是一個用來在JSP中實現頁面
  		佈局和裝飾(layout and decoration)的框架元件,
  		能夠幫助網站開發人員較容易實現頁面中動態內容和靜態裝飾外觀的分離
   -->
  <filter>
    <filter-name>sitemesh</filter-name>
    <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>sitemesh</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

2.user-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- springMVC 2.建立對應的servlet -->
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">
        
        
    <!-- 開啟SpringMVC -->
        <mvc:annotation-driven/>
        <context:component-scan base-package="cn.edu.zttc.controller"></context:component-scan>
        
        <mvc:resources location="/resources/" mapping="/resources/**"/>
        
	<!-- 配置檢視的字首和字尾 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        	<!-- <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property> -->
        	<property name="prefix" value="/WEB-INF/jsp/"></property>
        	<property name="suffix" value=".jsp"></property>
        </bean>
        
	    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	    	<property name="maxUploadSize" value="5000000"></property>
	    </bean>
</beans>

3.decorators.xml
<?xml version="1.0" encoding="UTF-8"?>

<!-- 
	裝飾者,將所有頁面都潛入basic的頁面之中,使用
	<decorator:body />標籤
	被嵌入的頁面不用填寫html的頭標籤等,只需要寫body資訊
 -->
<decorators defaultdir="/WEB-INF/temp/">
    <!-- Any urls that are excluded will never be decorated by Sitemesh -->
    <excludes>
        <pattern>/json*</pattern>
    </excludes>
    <decorator name="main" page="basic.jsp">
        <pattern>/*</pattern>
    </decorator>
</decorators>

4.basic.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator" %>
<!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">
<title>Insert title here</title>
</head>
<body>
<h1>
User Manager
</h1>
<hr/>
<decorator:body />
</body>
</html>

5.error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<!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">
<title>error</title>
</head>
<body>
${ex.message }
</body>
</html>

6.login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<!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">
<title>Insert title here</title>
</head>
<body>
<form method="post">
	username<input type="text" name="username"/><br/>
	password<input type="password" name="password"/><br/>
	<input type="submit"/>
</form>
</body>
</html>

7.add.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<!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">
<title>Insert title here</title>
</head>
<body>
<sf:form method="post" modelAttribute="user" enctype="multipart/form-data">
	username<sf:input path="username"/><sf:errors path="username"/><br/>
	password<sf:input path="password"/><sf:errors path="password"/><br/>
	nickname<sf:input path="nickname"/><br/>
	email<sf:input path="email"/><sf:errors path="email"/><br/>
	file<input type="file" name="files"/><br/>
	file<input type="file" name="files"/><br/>
	<input type="submit"/>
</sf:form>
</body>
</html>

8.list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!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" type="text/css" href="<%=request.getContextPath()%>/resources/css/main.css">
<title>Insert title here</title>
</head>
<body>
${loginUser.nickname}----${redir}<br/>
<a href="add">新增使用者</a>
<a href="login">使用者登入</a><br/>
<!-- 獲取的是map,所以需要先.value -->
<c:forEach items="${users }" var="user">
	<a href="${user.value.username}">檢視使用者</a><a href="${user.value.username}/update">更新</a><a href="${user.value.username}/delete">刪除</a>${user.value.username }=====${user.value.nickname }<br/>
</c:forEach>
</body>
</html>

9.show.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!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">
<title>Insert title here</title>
</head>
<body>
${user.username }=====${user.nickname }=====${user.email }<br/>
</body>
</html>

10.update.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<!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">
<title>Insert title here</title>
</head>
<body>
<sf:form method="post" modelAttribute="user">
	username<sf:input path="username"/><sf:errors path="username"/><br/>
	password<sf:input path="password"/><sf:errors path="password"/><br/>
	nickname<sf:input path="nickname"/><br/>
	email<sf:input path="email"/><sf:errors path="email"/><br/>
	<input type="submit"/>
</sf:form>
</body>
</html>

11.UserController
package cn.edu.zttc.controller;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;

import org.apache.commons.io.FileUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

import cn.edu.zttc.vo.User;
import cn.edu.zttc.vo.UserException;
/**
 * springMVC加入了JSR303(Bean Validate的功能)
 * @author admin
 */
@Controller
@RequestMapping("/user")
@SessionAttributes(value="loginUser")
public class UserController {
	private final static Map<String, User> users = new HashMap<String, User>();
	public UserController(){
		users.put("ldh", new User("ldh", "123", "[email protected]", "華仔"));
		users.put("zxy", new User("zxy", "123", "[email protected]", "學友"));
		users.put("gfc", new User("gfc", "123", "[email protected]", "郭富城"));
		users.put("lm", new User("lm", "123", "[email protected]", "黎明"));
	}
	/**
	 * 獲取使用者列表
	 * @param model
	 * @return
	 */
	@RequestMapping({"/users","/"})
	public String list(Model model){
		model.addAttribute("users",users);
		return "user/list";
	}
	/**
	 * 跳轉到新增頁面
	 * @param model
	 * @return
	 */
	@RequestMapping(value="/add",method=RequestMethod.GET)
	public String add(Model model){
		model.addAttribute(new User());
		return "user/add";
	}

	/**
	 * 
	 * 新增頁面提交請求,post方式
	 * @param user
	 * @param file 上傳檔案方式
	 * @param binding 接收錯誤資訊的(必須要在要進行驗證的物件之後)
	 * @return
	 */
	//引數user與頁面的form表單中的modelAttribute的值一樣
	@RequestMapping(value="/add",method=RequestMethod.POST)
	public String add(@Valid User user,BindingResult binding,@RequestParam MultipartFile[] files,HttpServletRequest req){
		if (binding.hasErrors()) {
			return "user/add";
		}
//		System.out.println(file.getContentType()+","+file.getName()+","+file.getOriginalFilename());
		String realPath = req.getSession().getServletContext().getRealPath("/resources/upload");
		for(MultipartFile file:files){
			try {
				System.out.println(realPath);
				FileUtils.copyInputStreamToFile(file.getInputStream(), new File(realPath+"/"+file.getOriginalFilename()));
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		users.put(user.getUsername(), user);
		//執行客戶端跳轉
		return InternalResourceViewResolver.REDIRECT_URL_PREFIX+"/user/users";
	}
	
	/**
	 * 顯示使用者資訊
	 * @param username
	 * @param model
	 * @return
	 */
	@RequestMapping(value="/{username}",method=RequestMethod.GET)
	public String show(@PathVariable String username,Model model){
		model.addAttribute(users.get(username));
		return "user/show";
	}
	
	/**
	 * 跳轉到更新頁面
	 * @param username
	 * @param model
	 * @return
	 */
	@RequestMapping(value="/{username}/update",method=RequestMethod.GET)
	public String update(@PathVariable String username,Model model){
		model.addAttribute(users.get(username));
		return "user/update";
	}
	/**
	 * 更新頁面提交請求
	 * @param username
	 * @param user
	 * @param br 接收錯誤資訊的
	 * @return
	 */
	//引數user與頁面的form表單中的modelAttribute的值一樣
	@RequestMapping(value="/{username}/update",method=RequestMethod.POST)
	public String update(@PathVariable String username,@Valid User user,BindingResult br){
		if (br.hasErrors()) {
			return "user/update";
		}
		users.put(username, user);
		return InternalResourceViewResolver.REDIRECT_URL_PREFIX+"/user/users";
	}
	
	/**
	 * 刪除操作
	 * @param username
	 * @return
	 */
	@RequestMapping(value="/{username}/delete",method=RequestMethod.GET)
	public String delete(@PathVariable String username){
		users.remove(username);
		return InternalResourceViewResolver.REDIRECT_URL_PREFIX+"/user/users";
	}

	/**
	 * 跳轉到登入頁面
	 * @return
	 */
	@RequestMapping(value="/login",method=RequestMethod.GET)
	public String login(){
		return "user/login";
	}
	/**
	 * 登入提交頁面
	 * @param username
	 * @param password
	 * @return
	 */
	@RequestMapping(value="/login",method=RequestMethod.POST)
	public String login(String username,String password,Model model){
		if (!users.containsKey(username)) {
			throw new UserException("使用者名稱不存在");
		}
		if (!password.equals(users.get(username).getPassword())) {
			throw new UserException("使用者名稱密碼不正確");
		}
		model.addAttribute("loginUser",users.get(username));
		return InternalResourceViewResolver.REDIRECT_URL_PREFIX+"/user/users";
	}
	
	/**
	 * 捕獲異常執行的方法
	 * @return
	 */
	@ExceptionHandler(UserException.class)
	public String handlerException(Exception ex,HttpServletRequest req){
		req.setAttribute("ex", ex);
		return "error";
	}
	
	/**
	 * redirect方式傳request範圍的物件
	 * @param model
	 * @param ra
	 * @return
	 */
	@RequestMapping(value="/redir")
	public String redir(Model model,RedirectAttributes ra){
		ra.addFlashAttribute("redir","我的redirect方式傳request範圍的物件");
		return InternalResourceViewResolver.REDIRECT_URL_PREFIX+"/user/users";
	}
}

12.User
package cn.edu.zttc.vo;

import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.NotEmpty;


public class User {
	private String username;
	private String password;
	private String email;
	private String nickname;
	
	public User() {
		super();
	}
	public User(String username, String password, String email, String nickname) {
		super();
		this.username = username;
		this.password = password;
		this.email = email;
		this.nickname = nickname;
	}
	
	@NotEmpty(message="使用者名稱不能為空")
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}

	@NotEmpty(message="密碼不能為空")
	@Size(min=1,max=20,message="密碼長度應在1-20之間")
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	@Pattern(regexp="^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$",message="郵箱格式不正確")
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getNickname() {
		return nickname;
	}
	public void setNickname(String nickname) {
		this.nickname = nickname;
	}
}

13.UserException
package cn.edu.zttc.vo;

public class UserException extends RuntimeException {
	private static final long serialVersionUID = 1L;

	public UserException() {
		super();
		// TODO Auto-generated constructor stub
	}

	public UserException(String message, Throwable cause) {
		super(message, cause);
		// TODO Auto-generated constructor stub
	}

	public UserException(String message) {
		super(message);
		// TODO Auto-generated constructor stub
	}

	public UserException(Throwable cause) {
		super(cause);
		// TODO Auto-generated constructor stub
	}

}

專案結構圖:


引入的包:


相關推薦

springMVC使用者登入例項

1.web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://

SpringMVC+Hibernate+Spring整合例項

這篇接著上篇,把沒貼完的程式碼寫完,上篇主要完成了一些公共配置和介面的東西,這篇把後臺的程式碼完成。 首先是web包下屬於的control層的類UserController,這相當於Struts中的Action,是重要的類: package com.tgb.web; import java.io.IOE

《Java從入門到放棄》入門篇:springMVC數據傳遞

java springmvc modelandview 上一篇講完了springMVC中數據傳遞中的接收數據,今天繼續完成數據的向後傳遞。數據傳遞的核心對象ModelAndView,註意其包名,不要引用錯了!正確的:org.springframework.web.servlet.ModelAndV

網路程式設計基礎【day08】:簡單socket例項

本節內容 1、概述 2、socket例項 3、總結 一、概述   之前我們只是介紹了soket的概念和一些邏輯圖表,下面我們來看看,socket的客戶端和服務端到底是怎麼用的? 二、socket例項 2.1 客戶端 2.1.1 客戶端程式碼邏輯圖 2.1.2 客戶端程式碼

網頁註冊登入資料庫

註冊頁面 <%@ page language="java" import="java.util.*" contentType="text/html;charset=utf-8"%> <html>   <head>   

scrapy爬蟲框架簡單入門例項

接著上一篇文章,我們已經可以用爬蟲訪問目標網站爬取頁面了,現在需要自動提交表單查詢資料,並且從頁面中篩選出每期中獎號碼儲存為json檔案匯出。首先建立一個scrapy.Item類(開啟專案資料夾下的items.py檔案): import scrapy class SsqSpiderIte

Python遺傳演算法框架使用例項多目標優化問題Geatpy for Python與Matlab的對比學習

在前面幾篇文章中,我們已經介紹了高效能Python遺傳和進化演算法框架——Geatpy的使用及一些案例。 本篇就一個多目標優化例項進行展開講述,並且與使用Matlab工具箱得到相近效果進行一些對比: Geatpy已於2018.09.20更新至1.0.6版本

SciKit-learn快速入門教程和例項

一,sklearn的常用屬性和功能 繼續上次對波士頓房價預測的討論,瞭解模型的屬性和功能。 #首先匯入庫,使用的是線性迴歸 from sklearn import datasets from sklearn.linear_model import LinearRegr

tensorflow 入門例項

import tensorflow as tf # 建立一個常量 op, 產生一個 1x2 矩陣. 這個 op 被作為一個節點 # 加到預設圖中. # # 構造器的返回值代表該常量 op 的返回值.

flume例項:監控伺服器日誌

1.實現功能: 監控日誌增加,並且將日誌資訊儲存到hdfs上 2.flume和hdfs整合 將hadoop對應jar包放到flume的lib目錄下 htrace-core-3.1.0-incubating.jar hadoop-hdfs-2.7.3.jar hadoo

Python爬蟲框架Scrapy例項

目標任務:使用Scrapy框架爬取新浪網導航頁所有大類、小類、小類裡的子連結、以及子連結頁面的新聞內容,最後儲存到本地。 大類小類如下圖所示: 點選國內這個小類,進入頁面後效果如下圖(部分截圖): 檢視頁面元素,得到小類裡的子連結如下圖所示: 有子連結

springMVC初始化流程

首先通過時序圖來探索Spring原始碼解析 - springMVC核心程式碼(一)中最後一個問題,spring mvc 提供的控制器型別handlerMappings  是如何被初始化的。有原始碼可得: 其初始化是在DispatcherServlet類中的這個方法進行的,

Swift教程_零基礎學習Swift完整例項_swift基礎簡單值、控制流、方法和閉包

三、Swift基礎介紹 本章將對Swift做一個簡單說明,內容取自《The Swift Programming Language》,並加之自己的理解。首先swift全域性作用域中的程式碼會被自動當做程

python爬蟲"Hello World"級入門例項,使用json從中國天氣網抓取資料

一、二話不說先上程式碼 python2.7版 #!/usr/bin/python2.7 #-*- coding=UTF-8 -*- import urllib import json def get_dic(url): page = urll

Python selenium自動化識別驗證碼模擬登入操作

首先故意輸入錯誤的賬號登陸,很快就會出現需要驗證碼了。 這裡可以看到圖片所在的標籤 和id,同時還有一個驗證碼地址,如下。該地址每次隨機生成一張圖片。 https://passport.baidu.com/cgi-bin/genimage?njGcb06e212fe

SpringBoot2.0Web開發例項Thymeleaf模板引擎

本文作者:Spring_ZYL 意見反饋:[email protected] 文章來源:https://blog.csdn.net/gozhuyinglong 版權宣告:本文版權歸作者所有,轉載請註明出處 一、引入Th

C# HTML解析工具HtmlAgilityPack使用例項--Web頁面

一、使用XPath精確解析指定的Dom節點 XPath字串的簡單獲取方法,是在瀏覽器開發者工具中指定節點右鍵》“Copy XPath” 如圖 //載入Web 的頁面並解析內容 string rowP

ETL抽取工具informatica powercenter designer例項

一、           建立任務Task 1.        建立一個任務(session).下圖命名有誤應該為S_ 而非WF_。 點選“W”圖示,進入任務定義。 任務中Sessions命名:S_分省標識_表名。 任務中WorkFlows命名: WF_表格 9.1:建立

ARCore之路-計算機視覺之例項

  在前一節中,我們已編寫完成了神經元細胞類(Neuron)和突觸類(Synapse),有了這兩個基本元件,我們就可以建設神經網路的高樓大廈了。我們的目標是建設一個帶一個隱藏層的雙層神經網路,當然,各層神經元細胞的個數由使用者自己決定,示意圖如下: public

使用HTML5搭建京東登入介面

在我們html檔案中,引入了2個css檔案,分別為reset.css和login.css。下面我們就來看一下這2個css檔案是如何實現佈局的。 先來看一下reset.css,這裡是對於整個html檔案共同的元素需要統一設定的樣式, 程式碼如下: login.css是針對性