这两天在学Spring MVC,感觉不懂的还是很多。不过好歹自己搭出了一个简单的demo。程序的主要目录如下:

  【图片被吃了。。。】

  下面的内容包括了所有的XML配置文件,Java文件,JSP界面,使用的包的话如下,大家可以自己去百度找找。

 【图片又被吃了。。。】

有些包好像没用到的说。。。先不管了。

下面开始demo。

 嗯,虽然目录图片没了,不过我给的代码应该是全的。

1.XML文件,包括了一个web.xml和一个springmvc-servlet.xml,代码如下:

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"
	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">
	<!-- 解决中文乱码问题 -->
	<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>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>CharacterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<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

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:beans="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" xmlns:p="http://www.springframework.org/schema/p"
	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 ">
	<mvc:annotation-driven />
	<!-- ①:对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
	<context:component-scan base-package="net.use" />

	<!-- 这两个类用来启动基于Spring MVC的注解功能,将控制器与方法映射加入到容器中 -->
	<beans:bean
		class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
	<beans:bean
		class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />

	<!-- 这个类用于Spring MVC视图解析 -->
	<beans:bean id="viewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/pages/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>
	
</beans:beans>

2.JSP界面,这个就很多了。不过总体上很粗略,丑到自己都不想看。

根据上面的配置信息,我是在WebContent的WEB-INF下面新建了一个pages文件夹,里面放入了所有的JSP代码。

按照界面跳转的顺序来看,首先是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">
<title>Insert title here</title>
</head>
<body>
    	<form action="login" method="post">
		<fieldset>
		<legend>登录</legend>
			<p>
				<label>姓名</label> <input type="text" id="name" name="name"
					tabindex="1">
			</p>
			<p>
				<label>密码š</label> <input type="text" id="pwd" name="pwd"
					tabindex="2">
			</p>
			<p id="buttons">
				<input id="reset" type="reset" tabindex="3" value="取消"> <input
					id="submit" type="submit" tabindex="4" value="登录†Œ">
			</p>
		</fieldset>
	</form>
	
	<form action="toRegister" method="POST">
	  <input id="reg" type="submit" value="注册">
	</form>
</body>
</html>

然后是fail_login和success_login,简单的在body里面加一句话:登录失败或者成功啥的。。。这个就不贴了。

下面是注册界面,和登录类似,多了一些其他的信息,如下:

<%@ 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">
<title>Insert title here</title>
</head>
<body>
  	<form action="register" method="post">
		<fieldset>
		<legend>注册</legend>
			<p>
				<label>姓名</label> <input type="text" id="name" name="name"
					tabindex="1">
			</p>
			<p>
			    <label>性别</label> <input type="text" id="sex" name="sex"
			        tabindex="2">
			</p>
			<p>
				<label>年龄š</label> <input type="text" id="age" name="age"
					tabindex="3">
			</p>
			<p>
				<label>密码š</label> <input type="text" id="pwd" name="pwd"
					tabindex="4">
			</p>
			
			<p>
				<label>确认密码š</label> <input type="text" id="pwd2" name="pwd2"
					tabindex="5">
			</p>
			<p id="buttons">
				<input id="reset" type="reset" tabindex="6" value="取消"> <input
					id="submit" type="submit" tabindex="7" value="注册†Œ">
			</p>
		</fieldset>
	</form>
</body>
</html>

然后是fail_register和success_register这两个JSP,同login的对应文件,body里面只有简单的提示信息。

好了,丑比界面也搞定了,下面就剩下Java的代码了。

3.Java的代码部分包括三个:User.java,一个封装了User信息的Java类。一样很简单,如下:

package net.use.info;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {
	/**
	 * @author zjn
	 */
	private static final long serialVersionUID = 1L;
	private Integer id; // id
	private String name; // name
	private String pwd; // pwd
	private Integer age; // age
	private Date creatTime; // creatTime
	
	private String sex;
	
	//全部实现了set和get方法�? 以此完成依赖注入(设值注入)
	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex=sex;
	}
	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 String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

	public Integer getAge() {
		return age;
	}

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

	public Date getCreatTime() {
		return creatTime;
	}

	public void setCreatTime(Date creatTime) {
		this.creatTime = creatTime;
	}

}

然后是Controller,在其中使用注释的方式来绑定对象和处理请求。。。。这个描述可能不大准确,毕竟新手,见谅见谅。代码如下:

package net.use.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

import net.use.dao.UserData;
import net.use.info.User;

@Controller
public class UserController {
	@RequestMapping("")
	public String Login(Model model) {
		return "login";//即首先显示的是登录界面
	}
	
	@RequestMapping("login")
	public String handleLogin(@ModelAttribute("form")User user,Model model) {
		UserData ud = new UserData();
		System.out.println("登录过程中使用的User对象信息:"+user.getName()+","+user.getSex()
		+","+user.getAge()+","+user.getPwd());
		if(ud.isRepeat(user)) {
			return "success_login";//登录成功
		}else {
			return "fail_login";
		}
	}
	@RequestMapping("toRegister")
	public String toRegister(Model model) {
		return "register";//跳转到注册界面
	}

	@RequestMapping("register")
	public String Save(@ModelAttribute("form") User user, Model model) { // user:视图层传给控制层的表单对象;model:控制层返回给视图层的对�?
		//model.addAttribute("user", user);
		//System.out.println(user.getName()+","+user.getSex()+","+user.getPwd()+","+user.getAge());
		if(user.getPwd().split(",").length>=2) {
			if(user.getPwd().split(",")[0].equals(user.getPwd().split(",")[1])) {
				System.out.println("前后密码不符合!");
				return "fail_register";
			}
			
		}
		UserData ud = new UserData();
		user.setPwd(user.getPwd().split(",")[0]);
		if(ud.isRepeat(user)) {
			System.out.println("当前输入的user重复");
			return "fail_register";//注册失败
		}else {
			ud.save(user);
			return "success_register";//注册成功
		}
	}
}

最后,关于数据保存和处理的dao层Java类。。一个简单的保存和分析文本文件信息的类,代码如下:

package net.use.dao;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import net.use.info.User;

public class UserData {
	public boolean save(User user) {
		System.out.println("开始save user!");
		if(isRepeat(user)) {
			return false;
		}
		File file = new File("user.txt");
		if(!file.exists()) {
			try {
				file.createNewFile();
				System.out.println("文件不存在!创建成功!");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		System.out.println("文件存在了,下面开始保存!");
		FileWriter fw;
		try {
			fw = new FileWriter(file,true);//true表示保留现有内容
			BufferedWriter bw = new BufferedWriter(fw);
			bw.write(user.getName()+"***"+user.getSex()+"***"+user.getAge()+"***"+user.getPwd()+"\r\n");
			System.out.println("user 保存完毕!!");
			System.out.println(file.getAbsolutePath());
			bw.close();//it is important to close the writer
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return true;
	}
	
	public boolean isRepeat(User user) {
		System.out.println("开始查找是否重复!");
		boolean res = false;
		File file = new File("user.txt");
		if(file.exists()) {
			try {
				FileReader fr = new FileReader(file);
				BufferedReader br = new BufferedReader(fr);
				String nextLine="";
				while((nextLine=br.readLine()) !=null) {
					String[] info = nextLine.split("\\*\\*\\*");//转义字符的锅,加上\\才能识别
					if(info[0].equals(user.getName()) && info[3].equals(user.getPwd())) {
						System.out.println("发现用户重复");
						res=true;
					}
				}
				
				br.close();
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		System.out.println("未发现用户重复");
		return res;
	}

}

好了,三个部分齐了。下面只要你的配置正确,包引用到位,那么就应该没问题了。

总而言之,丑虽然丑,,,,好歹还是搭出来了。。。