Struts是Apache软件组织提供的一项开源项目,作为系统整体基础的架构,负责MVC的分离,它的模型部分控制业务跳转,负责在表示层展现数据对象中的数据。Struts为WEB应用提供了一个通用的框架,使开发人员可以把精力集中在如何解决实际业务问题上。struts2相比struts来说是一个全新的框架,它是基于Webwork的一种技术框架。
此小程序主要是利用struts2进行将用户名和密码存放在数据库中进行登录验证。开发工具为myeclipse10,数据库为mysql,中间件为tomcat。
首先在myeclipse中新建一个web项目,命名为LoginData。然后右击所创建的项目选址myeclipse–>Add struts capabilities,出现添加struts的对话框,选择struts2.1,然后默认完成。添加mysql-connnection-java-5.0-bin.jar包,以便连接数据库。
本项目主要构成如下:
登录页面:loginview.jsp; 登录成功页面:success.jsp; 登录失败页面:failure.jsp;控制类:mycontrol.Control.java;模型类:mymodel.Model.java;乱码处理类:myfilter.EncodingFilter.java 实体类:myentity.User.java; 数据库连接类:mydbutil.DbConnection.java;
项目结构如下所示:
首先将jsp页面创建出来。
inputview.jsp主要用作登录界面,代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%
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>登录首页</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" type="text/css" href="styles.css">
-->
</head>
<!-- 本页面为用户登录页面 -->
<body>
<div align="center">
<h2>用户登录</h2>
<form action="Login" method="post">
<!-- 此处的适合控制器中的值关联的,username,userpassword。 -->
用户名:<input id="username" name="username" type="text" />
密码:<input id="userpassword" name="userpassword" type="password" />
<input type="submit" value="登陆" /><br />
</form>
</div>
</body>
</html>
success.jsp登陆成功页面,代码如下
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%
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>登录成功!</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" type="text/css" href="styles.css">
-->
</head>
<!-- 该页面为登录成功后的页面 -->
<body>
<marquee>
欢迎来到登录成功页面!<br />=*==**==*=
</marquee>
<div align="center">
<h2>您好,欢迎来到本空间</h2>
</div>
</body>
</html>
failure.jsp登录失败页面,代码如下
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%
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>登录失败!</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" type="text/css" href="styles.css">
-->
</head>
<!-- 该页面为登录成功后的页面 -->
<body>
<div align="center">
<h1>登录失败</h1>
</div>
<a href="inputview.jsp">返回上一层</a>
</body>
</html>
然后创建实体类User.java
package myentity;
public class User {
// 用来获取登录所用的用户名和密码
private int id;
private String name;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
数据库连接程序DbConnection.java,代码如下
package mydbutil;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DbConnection {
private Connection conn;
public Connection getConnection() throws SQLException {
try {
// 加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 获取连接地址和用户名密码
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/myweb", "root", "root");
} catch (ClassNotFoundException e) {
System.out.println("找不到服务!!");
e.printStackTrace();
}
return conn;
}
// 关闭所有连接操作,保证所有连接都可以关闭
public void closeAll(Connection conn, PreparedStatement ps, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
}
}
}
业务模型层Model.java,代码如下
package mymodel;
/**
* 本类为登录应用的模型层
*/
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import mydbutil.DbConnection;
import myentity.User;
public class Model {
public Model() {
}
User user = new User();
public boolean checkUser(String name, String pwd) {
user = this.queryByName(name);
if (user != null) {
// 控制器ServletControl中的n、p接收到jsp页面传过来的usernamepassword值,然后把它赋值给n=name,p=pwd
return (name.equals(user.getName()) && pwd.equals(user
.getPassword()));// 此句是将控制器接收到的值和实体类User中的数据进行比较
} else {
return false;
}
}
// 获取连接
private PreparedStatement ps;
private ResultSet rs;
Connection conn = null;
DbConnection s = new DbConnection();
public User queryByName(String rname) {
User user = null;
// 根据用户名查询密码
String sql = "select * from user where name = ?";
try {
Connection conn = s.getConnection();
ps = conn.prepareStatement(sql);
ps.setString(1, rname);
rs = ps.executeQuery();
if (rs.next()) {
user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setPassword(rs.getString("password"));
}
// 关闭所有连接
s.closeAll(conn, ps, rs);
} catch (Exception e) {
e.printStackTrace();
}
// 返回到调用处
return user;
}
}
控制类Control.java,代码如下
package mycontrol;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import mymodel.Model;
/**
* 本类为登录页面的控制类
*
* @author Administrator
*
*/
public class Control extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
public Control() {
super();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 设置默认的编码为gbk
req.setCharacterEncoding("GBK");
String n = req.getParameter("username");// 此处的name和password是和servletControl关联的
String p = req.getParameter("userpassword");
Model model = new Model();
// 控制跳转的页面
if (model.checkUser(n, p)) {
resp.sendRedirect("successview.jsp");
} else {
resp.sendRedirect("failure.jsp");
}
}
}
所用sql语句:
drop database if exist myweb;
create database myweb;
user myweb;
create table user(
id tinyint not null auto_increment primary key,
username varchar(20) not null,
userpwd varchar(20) not null
);
SHOW VARIABLES LIKE 'CHARACTER%';
ALTER TABLE users CHARACTER SET gbk;
insert into user values(1,'admin','admin');
insert into user values(2,'client','client');
乱码处理过滤器类:EncodingFilter.java,代码如下
package myfilter;
/**
* 解决乱码问题的类
*/
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class EncodingFilter implements Filter {
private String charset=null;
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
req.setCharacterEncoding(this.charset); // 设置默认编码
chain.doFilter(req, resp);
}
public void init(FilterConfig arg0) throws ServletException {
// 此处如果不加引号”charset“会出现空指向异常
this.charset=arg0.getInitParameter("charset");
}
}
web配置如下
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>inputview.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Login</servlet-name>
<servlet-class>mycontrol.Control</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Login</servlet-name>
<url-pattern>/Control</url-pattern>
</servlet-mapping>
<!-- 设置乱码处理 -->
<filter>
<filter-name>encoding</filter-name>
<filter-class>
myfilter.EncodingFilter
</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
然后将其部署到Tomcat上进行测试,这里我使用的是Tomcat7.0。测试结果如下: