这两天在学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;
}
}
好了,三个部分齐了。下面只要你的配置正确,包引用到位,那么就应该没问题了。
总而言之,丑虽然丑,,,,好歹还是搭出来了。。。