首先先创建一个大的包com.wangyijie.struts
在这个包下面再创建四个包
在我的工程里面有个c3p0-config.xml这个是用来连接数据库使用的 自己配置好自己的参数值
//c3p0-config.xml 这是c3p0的配置 首先要创建一个数据库
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/bookstore</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">111111</property>
<property name="acquireIncrement">3</property>
<property name="initialPoolSize">5</property>
<property name="minPoolSize">2</property>
<property name="maxPoolSize">8</property>
</default-config>
</c3p0-config>
首先要先写javaBean Student类
public class Student implements Serializable {
private int id;
private String username;
private String password;
private String gender;
private String hobby;//吃饭,睡觉,学java
private Date birthday;
private String email;
private int grade;
@Override
public String toString() {
return "Student{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", gender='" + gender + '\'' +
", hobby='" + hobby + '\'' +
", birthday=" + birthday +
", email='" + email + '\'' +
", grade=" + grade +
'}';
}
public Student() {
}
public Student(int id, String username, String password, String gender, String hobby, Date birthday, String email, int grade) {
this.id = id;
this.username = username;
this.password = password;
this.gender = gender;
this.hobby = hobby;
this.birthday = birthday;
this.email = email;
this.grade = grade;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
}
这个是注册的jsp页面
<%@ taglib prefix="s" uri="/struts-tags" %>
<%--
Created by IntelliJ IDEA.
User: dllo
Date: 2017/7/5
Time: 上午11:43
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<s:head/>
</head>
<body>
<s:fielderror/>
<form action="${pageContext.request.contextPath}/stu/regist.action" method="post">
<table border="1" width="438">
<tr>
<td>用户名:</td>
<td>
<input type="text" name="username"/>
</td>
</tr>
<tr>
<td>密码:</td>
<td>
<input type="password" name="password"/>
</td>
</tr>
<tr>
<td>性别:</td>
<td>
<input type="radio" name="gender" value="male" checked="checked"/>男性
<input type="radio" name="gender" value="female"/>女性
</td>
</tr>
<tr>
<td>爱好:</td>
<td>
<input type="checkbox" name="hobbies" value="吃饭"/>吃饭
<input type="checkbox" name="hobbies" value="睡觉"/>睡觉
<input type="checkbox" name="hobbies" value="学java"/>学java
</td>
</tr>
<tr>
<td>出生日期:(yyyy-MM-dd)</td>
<td>
<input type="text" name="birthday"/>
</td>
</tr>
<tr>
<td>邮箱:</td>
<td>
<input type="text" name="email"/>
</td>
</tr>
<tr>
<td>成绩:</td>
<td>
<input type="text" name="grade"/>
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="注册"/>
</td>
</tr>
</table>
</form>
<hr>
<a href="/login.jsp">登录</a>
</body>
</html>
login登录的jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<%--
Created by IntelliJ IDEA.
User: dllo
Date: 17/5/10
Time: 下午4:45
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<s:head/>
</head>
<body>
<s:fielderror/>
<%--<p style="color: red">${msg}</p>--%>
<form action="${pageContext.request.contextPath}/stu/login" method="post">
用户名: <input type="text" name="username"/><br>
密码: <input type="password" name="password"/><input type="submit" value="登录"/>
</form>
</body>
</html>
StudentAction 动作类
public class StudentAction extends ActionSupport implements ModelDriven<Student>, ServletRequestAware {
private StudentService studentService = new StudentServiceImpl();
private HttpServletRequest request;
private Student stu = new Student();
// 特殊处理: hobbies
private String[] hobbies;
public String[] getHobbies() {
return hobbies;
}
public void setHobbies(String[] hobbies) {
this.hobbies = hobbies;
}
public String regist(){
try {
// 单独处理爱好
if (hobbies != null && hobbies.length>0){
StringBuffer sb = new StringBuffer();
for (int i = 0;i<hobbies.length;i++){
if(i>0){
sb.append(",");
}
sb.append(hobbies[i]);
}
stu.setHobby(sb.toString());
}
studentService.register(stu);
System.out.println("注册成功~");
return SUCCESS;
}catch (Exception e){
request.setAttribute("error", "系统发生错误! 请稍后重试!");
return ERROR;
}
}
public String login(){
try {
boolean flag = studentService.login(stu);
if (flag == false){
request.setAttribute("msg", "用户名或密码错误!");
return LOGIN;
}
}catch (Exception e){
request.setAttribute("error", "系统发生错误! 请稍后重试!");
return ERROR;
}
request.getSession().setAttribute("user", stu);
return SUCCESS;
}
//在这里来说验证规则
// 输入验证:
// 1.编程式验证
// [1] 针对动作类中所有的动作方法
// [2] 针对动作类中部分的动作方法
//
//
// [1]针对动作类中所有的动作方法
// 可以判断一些验证是否重复或者是否为空 直接调用该方法就可以使用判断
@Override
public void validate() {
if ("".equals(stu.getUsername().trim())){
addFieldError("stu.username", "用户名不能为空!");//向map添加错误
//出现错误,会转向result=input 视图
}
}
// [2] 针对动作类中部分的动作方法
// a. 使用注解对方法进行忽略
// b. 只针对该方法进行验证: 例如 regist.validateRegist 就是针对regist这个方法进行验证
@SkipValidation //忽略的意思 可以在regist的方法中试一下方法 会输出findAll 就是忽略了这个方法
public String findAll(){
System.out.println("findAll");
return null;
}
// 就是针对regist这个方法进行验证
public void validateRegist() {
if ("".equals(stu.getUsername().trim())){
addFieldError("stu.username", "用户名不能为空!");//向map添加错误
//出现错误,会转向result=input 视图
}
}
public Student getStu() {
return stu;
}
public void setStu(Student stu) {
this.stu = stu;
}
@Override
public Student getModel() {
return stu;
}
@Override
public void setServletRequest(HttpServletRequest httpServletRequest) {
this.request = httpServletRequest;
}
创建一个StudentService接口 和 StudentServiceImplement实现类
//StudentService接口
public interface StudentService {
void register(Student stu);
boolean login(Student stu);
}
//StudentServiceImplement实现类
public class StudentServiceImpl implements StudentService {
private StudentDao studentDao = new StudentDaoImpl();
@Override
public void register(Student stu) {
studentDao.addStu(stu);
}
@Override
public boolean login(Student stu) {
Student student = studentDao.queryStu(stu);
if (student != null){
return true;
}
return false;
}
创建一个StudentDao的接口和StudentDaoImplement实现类
//StudentDao的接口
public interface StudentDao {
void addStu(Student stu);
Student queryStu(Student stu);
}
//StudentDaoImplement实现类 用来连接数据库 向数据库中进行增删改查
public class StudentDaoImpl implements StudentDao{
private GxQueryRunner qr = new GxQueryRunner();
@Override
public void addStu(Student stu) {
String sql = "INSERT INTO students VALUES(?,?,?,?,?,?,?,?)";
Object[] params = {null, stu.getUsername(), stu.getPassword(), stu.getGender(), stu.getHobby(), stu.getBirthday(), stu.getEmail(), stu.getGrade()};
try {
qr.update(sql, params);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
@Override
public Student queryStu(Student stu) {
String sql = "SELECT * FROM students WHERE username=? AND password = ?";
Object[] params = {stu.getUsername(), stu.getPassword()};
try {
Student u = qr.query(sql, new BeanHandler<Student>(Student.class), params);
return u;
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
struts2.xml
<struts>
<package name="regist" extends="struts-default" namespace="/stu">
<action name="regist" class="com.wangyijie.struts.web.controller.StudentAction" method="regist">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
<result name="input">/regist.jsp</result>
</action>
<action name="login" class="com.wangyijie.struts.web.controller.StudentAction" method="login">
<result name="success" type="redirect">/home.jsp</result>
<result name="input">/login.jsp</result>
<result name="login">/login.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
验证规则
第一个.xml是只针对regist注册的这个方法进行验证
<validators>
<validator type="regex">
<param name="fieldName">stu.username</param>
<param name="regexExpression">
<![CDATA[
[a-zA-Z]{3,8}
]]>
</param>
<message>您的名字必须由3~8个字母组成</message>
</validator>
<field name="stu.password">
<field-validator type="regex">
<param name="regexExpression">
<![CDATA[
\d{3,8}
]]>
</param>
<message>您的密码必须由3-8个数字组成</message>
</field-validator>
</field>
<field name="stu.username">
<field-validator type="requiredstring">
<message>哈哈哈 你的用户名又空啦</message>
</field-validator>
</field>
<field name="stu.gender">
<field-validator type="required">
<message>请选择性别的类型</message>
</field-validator>
</field>
<field name="stu.email">
<field-validator type="email">
<message>请输入正确的邮箱</message>
</field-validator>
</field>
<field name="stu.grade">
<field-validator type="int">
<param name="min">0</param>
<param name="max">150</param>
<message>年龄范围在0-150之间</message>
</field-validator>
</field>
<field name="stu.birthday">
<field-validator type="date">
<param name="min">2010-01-01</param>
<param name="max">2010-12-31</param>
<message>生日在2010-01-01-01到2010-12-31之间</message>
</field-validator>
</field>
</validators>
第二个是针对当前的动作类的所有的验证规则 例如:包括这个小项目中login登录的方法也使用这个验证规则
<validators>
<!--要验证的字段名-->
<field name="stu.username">
<!--验证规则-->
<!--requiredstring: 空字符串-->
<!--required: 是不是null-->
<field-validator type="requiredstring">
<!--报错信息-->
<message>您的用户名不能为空</message>
</field-validator>
</field>
</validators>