运用struts2框架实现登陆注册

本文介绍了使用Struts2框架实现登陆注册功能,包括字符串到POJO的转换、国际化(i18n)、服务器端输入验证及初步的权限控制。在MyEclipse环境中配置Struts2项目,通过自定义拦截器进行权限管理,同时展示了数据库和登陆页面的实现。

刚刚学完struts2框架,趁热打铁,做了个struts2MVC小项目练练手。主要用到了struts2的机制实现了登陆注册,

1.字符串到POJO类型的转换,

2.利用i18n拦截器实现了中英文国际化,

3.利用validate拦截器框架效验实现服务器端输入验证,

4.struts2标签库以及利用自定义拦截器实现权限控制(第四条下篇博客再进行介绍)

建完项目后,引入jar包,我们用myeclipse自带的struts2jar包就ok,右键工程->MyEclipse->Project Faset->strutr2.x   完成之后就成功导入jar包

5.国际化实现之后,有三种方式实现中英文切换,前两种太过死板,第三种最灵活(推荐使用)

1>.直接在浏览器中修改浏览器语言

2>.在代码中设置locale属性。在struts.xml中加一个静态值(此方法虽然最简便,但不是长久之计)

代码:

<constant name="struts.locale" value="zh_CN"></constant>
<span style="white-space:pre">	</span>若设置美国英文,将value值改为:en_US
3>.实现动态国际化,在页面中加入超连接的形式来实现,具体实现参见:点击打开链接

工程截图如下:


运行界面:






一、数据库介绍

	用mysql实现
	一个用户表,三个字段,
	varchar类型的userName,password
	int类型的role用来设置权限(此篇博客暂时没用到)
	数据库表截图如下:

二、首先实现登陆页面

可以用struts2框架自带的标签库来定义,我用的html标签实现的,因为要实现国际化,框架效验,以及POJO的类型转化,所以还要引入struts2的标签库。
引入库的代码为:
<%@ taglib uri="/struts-tags" prefix="s" %>
代码如下:
login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%@ page import="com.user.bean.User" %>
<%
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><s:text name="title_login"></s:text></title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
  </head>
  <body>
  <div><s:fielderror /></div>
    <form action="loginAction" method="post" name="form1">
    <table align="center">
    	<tr>
    		<td><s:text name="username"></s:text></td>
    		<td><input type="text" name="user.userName"></td>
    	</tr>
    	<tr>
    		<td><s:text name="password"></s:text></td>
    		<td><input type="password" name="user.password"></td>
    	</tr>
    	<tr>
    		<%--struts标签这样写 <td colspan="2"><s:radio name="user.role" list="#{'0':'普通用户','1':'管理员'}"/></td> --%>
    		<td>普通用户:<input type="radio" name="user.role" value="0"></td>
    		<td>超级用户:<input type="radio" name="user.role" value="1"></td>
    	</tr>
    	<tr>
    		<td><input type="submit" value=<s:text name="submit"></s:text>></td>
    		<td><input type="reset" value=<s:text name="reset"></s:text>>    <input type="button" value=<s:text name="regist"></s:text> onclick="window.location.href='Page/register.jsp'"></td>
    	</tr>
    </table>
    <s:actionerror/>
    </form>
  </body>
</html>
register.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
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><s:text name="title_regist"></s:text></title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
  </head>
  <body>
    <form action="registAction" method="post" name="form1">
    <table align="center">
    	<tr>
    		<td><s:text name="username"></s:text></td>
    		<td><input type="text" name="user.userName"></td>
    	</tr>
    	<tr>
    		<td><s:text name="password"></s:text></td>
    		<td><input type="password" name="user.password"></td>
    	</tr>
    	<tr>
    		<td>普通用户:<input type="radio" name="user.flag" value="0"></td>
    		<td>超级用户:<input type="radio" name="user.flag" value="1"> </td>
    	</tr>
    	<tr>
    		<td><input type="submit" value=<s:text name="regist"></s:text>></td>
    		<td><input type="reset" value=<s:text name="reset"></s:text>></td>
    	</tr>
    </table>
    <s:actionerror/>
    </form>
  </body>
</html>
com.user.bean包下实体类:
User.java
package com.user.bean;

public class User {
	private int role;
	private String userName;
	private String password;

	/**
	 * @return the role
	 */
	public int getRole() {
		return role;
	}
	/**
	 * @param role the role to set
	 */
	public void setRole(int role) {
		this.role = role;
	}
	/**
	 * @return the userName
	 */
	public String getUserName() {
		return userName;
	}
	/**
	 * @param userName the userName to set
	 */
	public void setUserName(String userName) {
		this.userName = userName;
	}
	/**
	 * @return the password
	 */
	public String getPassword() {
		return password;
	}
	/**
	 * @param password the password to set
	 */
	public void setPassword(String password) {
		this.password = password;
	}
	
}
com.user.action包下UserAction.java
package com.user.action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.user.bean.User;
import com.user.dao.UserDao;
import com.user.dao.UserDaoImpl;
public class UserAction extends ActionSupport{
	private static final long serialVersionUID = 1L;
	private User user;
	private UserDao userDao = new UserDaoImpl();
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	//注册
	public String regist(){
		UserDaoImpl dao = new UserDaoImpl();
		int i = dao.Register(user);
		if(i!=-1){
			return SUCCESS;
		}else{
			return ERROR;
		}
	}
	//登陆验证
	public String login(){
		User checkUser = userDao.userLogin(user.getUserName(),user.getPassword(),user.getRole());
		if(null == checkUser){
			return ERROR;
		}else{
			ActionContext.getContext().put("tip", getText("success"));
			ActionContext.getContext().put("username", user.getUserName());
			return SUCCESS;
		}
	}
	//重写validate方法,完成输入效验
	/* (non-Javadoc)
	 * @see com.opensymphony.xwork2.ActionSupport#validate()
	 */
	@Override
	public void validate() {
		//如果用户名为空或为空字符串,则添加错误信息
		if(user.getUserName() == null||user.getUserName().trim().equals("")){
			//添加表单效验错误信息
			addFieldError("username", "输入的用户名不能为空");
		}
		//如果密码为空或为空字符串,则添加错误信息
		if(user.getPassword()==null ||user.getPassword().trim().equals("")){
			addFieldError("password", "输入的密码不能为空");
		}
	}
}
com.user.dao包下
UserDao.java
package com.user.dao;

import com.user.bean.User;

public interface UserDao {
	//用户登陆 
	public User userLogin(String userName,String password,int role);
	//用户注册
	public int Register(User user);
}
UserDaoImpl.java
package com.user.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.user.bean.User;
import com.user.util.DBConnection;

public class UserDaoImpl implements UserDao {
	@Override
	public User userLogin(String userName,String password,int role) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		User user = null;
		//获得链接
		conn = DBConnection.getConn();
		//准备
		String sql_userCheck="select userName,password,role from user where userName=? and password=? and role=?";
		try {
			pstmt = conn.prepareStatement(sql_userCheck);
			pstmt.setString(1, userName);
			pstmt.setString(2, password);
			pstmt.setInt(3, role);
			rs = pstmt.executeQuery();
			if(rs.next()){
				user = new User();
				user.setUserName(rs.getString("userName"));
				user.setPassword(rs.getString("password"));
				user.setRole(rs.getInt("role"));
				System.out.println(user.getUserName());
				System.out.println(user.getPassword());
				System.out.println(user.getRole());
			}
		} catch (SQLException e) {
			System.out.println("登陆错误!");
			e.printStackTrace();
		} finally{
			DBConnection.closeConn(conn);
			DBConnection.closeStatement(pstmt);
			DBConnection.closeResult(rs);
		}
		return user;
	}

	@Override
	public int Register(User user) {
		int i=-1;
		Connection conn = null;
		PreparedStatement pstmt = null;
		try{
			//获得链接
			conn = DBConnection.getConn();
			//准备
			String sql_userCheck="INSERT INTO user (user.userName,user.password,user.flag) VALUES(?,?,?)";
			pstmt = conn.prepareStatement(sql_userCheck);
			pstmt.setString(1, user.getUserName());
			pstmt.setString(2, user.getPassword());
			pstmt.setInt(3, user.getRole());
			i = pstmt.executeUpdate();
		}catch(SQLException e){
			System.out.println("注册错误");
			e.printStackTrace();
		}finally{
			DBConnection.closeConn(conn);
			DBConnection.closeStatement(pstmt);
		}
		return i;
	}
}
com.user.util包下
DBConnection.java
package com.user.util;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
 * 数据库连接和关闭
 * @author yl
 *
 */
public final class DBConnection {
	private static String DRIVER;
	private static String URL;
	private static String USER;
	private static String PWD;
	private static Properties pr = new Properties();
	
	static{
		try {
			pr.load(DBConnection.class.getClassLoader().getResourceAsStream("db.properties"));
			DRIVER = pr.getProperty("driver");
			URL = pr.getProperty("url");
			USER = pr.getProperty("user");
			PWD = pr.getProperty("pass");
		} catch (IOException e) {
			System.out.println("加载资源文件错误");
			e.printStackTrace();
		}
	}
	//1.注册驱动
	static{
		try {
			Class.forName(DRIVER);
		} catch (ClassNotFoundException e) {
			System.out.println("注册驱动失败!");
			e.printStackTrace();
		}
	}
	
	//2.获得连接
	public static Connection getConn(){
		Connection conn = null;
		try {
			conn = DriverManager.getConnection(URL, USER, PWD);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("数据库连接失败");
			e.printStackTrace();
		}		
		return conn;
	}
	
	//3.关闭连接
	public static void closeConn(Connection conn){
		if(conn!=null){
			try {
				conn.close();
			} catch (SQLException e) {
				System.out.println("关闭连接失败");
				e.printStackTrace();
			}
		}
	}
	
	//4.关闭执行对象
	public static void closeStatement(Statement stmt){
		if(stmt!=null){
			try {
				stmt.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	//5.关闭结果集
	public static void closeResult(ResultSet rs){
		if(rs!=null){
			try {
				rs.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}
db.properties

driver=com.mysql.jdbc.Driver
url=jdbc\:mysql\://localhost\:3306/user_manager
user=root
pass=root

i18n_en_US.properties

userName=User Name\uFF1A
password=Password\uFF1A
title_login=Login Page
submit=Submit
reset=Reset
regist=Regist
success=Congratulations {0}\uFF0CLogin success\uFF01

i18n_zh_CN.properties

username=\u7528\u6237\u540D\uFF1A
password=\u5BC6\u7801\uFF1A
title_login=\u767B\u9646\u9875\u9762
submit=\u767B\u9646
reset=\u91CD\u7F6E
regist=\u6CE8\u518C
success=\u606D\u559C{0}\uFF0C\u767B\u9646\u6210\u529F\uFF01

struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
	<constant name="struts.custom.i18n.resources" value="i18n"></constant>
	<constant name="struts.locale" value="zh_CN"></constant>
	<package name="userManager" extends="struts-default">
		<action name="loginAction" class="com.user.action.UserAction" method="login">
			<result name="success">/WEB-INF/Page/loginSuccess.jsp</result>
			<result name="error">/WEB-INF/Page/loginFailed.jsp</result>
			<result name="input">/Page/login.jsp</result>
		</action>
		<action name="registAction" class="com.user.action.UserAction" method="regist">
			<result name="success">/Page/login.jsp</result>
			<result name="error">/Page/register.jsp</result>
			<result name="input">/Page/register.jsp</result>
		</action>
	</package>
</struts>    



实战Nginx:取代Apache的高性能Web服务器 作者: 张宴 出版社: 电子工业出版社 出版年: 20102月 内容简介   Nginx (“engine x”) 是俄罗斯人Igor Sysoev编写的一款高性能HTTP 和反向代理服务器。Nginx选择了epoll和kqueue作为网络I/O模型,在高连接并发的情况下,Nginx是Apache服务器不错的替代品,它能够支持高达50 000个并发连接数的响应,运行稳定,且内存、CPU等系统资源消耗非常低。   本书主要分为4个部分,第1部分为基础篇,介绍了Nginx服务器的安装与配置方法;第2部分为进阶篇,重点介绍了Nginx的配置优化方法、Nginx与PHP/Ruby/Python/JSP/Perl/Memcached的结合配置方法、Nginx HTTP反向代理与负载均衡的配置与优化、Nginx模块开发等,最后还分析了新浪的开源软件项目──基于Nginx的NCache网页缓存系统;第3部分为实战篇,分析了Nginx在国内知名网站(如新浪播客、搜狐博客等)中的应用案例;第4部分为模块篇,对Nginx的基本模块和第三方模块进行了集中介绍。   本书是为对配置管理Nginx服务器感兴趣的读者准备的,适用于以前没有接触过Nginx,或者对Nginx有一些了解并希望能够进一步深入学习的专业系统工程师、个人网站站长及Linux/Unix从业人员。   作者简介   张宴,就职于北京金山软件公司,金山游戏官方网站──逍遥网(xoyo.com)系统架构师,技术支持部平台组组长。曾在新浪网、赶集网等公司任系统工程师、系统架构师,工作内容主要涉及:服务器系统架构设计与部署、系统运维与调优、网络故障解决、网站后端以及接口类PHP程序开发、Unix开源软件二次开发、服务器监控系统开发、系统运维与平台研发团队管理。 第1章 Nginx简介.pdf 第2章 Nginx服务器的安装与配置.pdf 第3章 Nginx的基本配置与优化.pdf 第4章 Nginx与PHP(FastCGI)的安装、配置与优化.pdf 第5章 Nginx与JSP、ASP.NET、Perl的安装与配置.pdf 第6章 Nginx HTTP负载均衡和反向代理的配置与优化.pdf 第7章 Nginx的Rewrite规则与实例.pdf 第8章 Nginx模块开发.pdf 第9章 Nginx的Web缓存服务与新浪网的开源NCACHE模块.pdf 第10章 Nginx在国内知名网站中的应用案例.pdf 第11章 Nginx的非典型应用实例.pdf 第12章 Nginx的核心模块.pdf 第13章 Nginx的标准HTTP模块.pdf 第14章 Nginx的其他HTTP模块.pdf 第15章 Nginx的邮件模块.pdf
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值