Struts2(二.用户登录模块)

1.编写Javabean

/src/myuser/User.java

在strut1中,Javabean需要继承于struts1 api中的ActionForm类。struts2没有此要求

struts2 也没有formbean,通常使用Domain Model的方式向action注入数据

 1 package myuser;
 2 
 3 public class User {
 4     private int id;
 5     private String userName;
 6     private String pwd;
 7     public int getId() {
 8         return id;
 9     }
10     public void setId(int id) {
11         this.id = id;
12     }
13     public String getUserName() {
14         return userName;
15     }
16     public void setUserName(String userName) {
17         this.userName = userName;
18     }
19     public String getPwd() {
20         return pwd;
21     }
22     public void setPwd(String pwd) {
23         this.pwd = pwd;
24     }
25     
26 }

 

2.编写DAO类

/src/myuser/UserDAO.java

JNDI方式连接数据库,具体操作参考JNDI和JDBC的区别和联系及其使用方法

package myuser;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import db.DbLib;

public class UserDAO {
    private Connection conn;
    PreparedStatement ps;
    public String sql;
    
    /**
     * 通过JNDI的方式连接数据库
     * @throws ClassNotFoundException
     * @throws SQLException
     * @throws NamingException
     */
    public UserDAO() throws ClassNotFoundException, SQLException, NamingException
    {
        //JNDI方式
        Context ctx = new InitialContext();  
        //获取数据源
        DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysql");
        //通过数据源取连接池中的连接
        conn = ds.getConnection(); 
    }
    
    /**
     * 用户登录
     * @param user
     * @return
     * @throws SQLException
     */
    public boolean checkLogin(User user) throws SQLException
    {
        boolean flag=false;
        sql="select * from users where userName=? and pwd=?";
        ps=conn.prepareStatement(sql);
        ps.setString(1, user.getUserName());
        ps.setString(2, user.getPwd());
        ResultSet rs=ps.executeQuery();
        if(rs.next())
        {
            flag=true;
        }
        conn.close();
        System.out.println("登录成功");
        return flag;
    }

 

3.编写Action

/src/myuser/UserAction.java

在struts1, action必须继承于struts1 api 中Action。struts2,没有继承类或实现接口的要求,随便写一个类,都可以做struts2 的action

action中的处理请求的方法的签名是有要求
格式:public String execute()

package myuser;

import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.naming.NamingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import mypicture.Picture;
import mypicture.PictureDAO;

/**
 * 为了方便继承ActionSupport
 */
public class UserAction extends ActionSupport {

    /**
     * action运行的时候的servlet环境
     * 获取response
     */
    HttpServletResponse response=ServletActionContext.getResponse();
    /**
     * 获取request,再获取session
     */
    HttpServletRequest request=ServletActionContext.getRequest();
    HttpSession session=request.getSession();
    PrintWriter out;
    
    /**
     * 向action注入数据的方式,通常使用Domain Model的方式
     */
    private User user;
    
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    
    /**
     * 用户登录
     * @return
     * @throws Exception
     */
    public String checkLogin() throws Exception {
        out=response.getWriter();
        UserDAO dao=new UserDAO();
        if(!dao.checkLogin(user))
        {
            out.print("0");
        }
        //把user存入session中
        session.setAttribute("user", user);
        out.print("1");
        //不跳转
        return null;
    }

 

4.配置Action

/src/struts.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <!-- struts2常量 -->
    <!-- 控制请求action时的后缀,默认为空或者.action -->
    <constant name="struts.action.extension" value="action,,"/>
    <!-- 控制开发模式,默认为false,若为true则表示改了action后可以不重启-->
    <constant name="struts.devMode" value="true"/>
    <!-- 控制上传文件大小 3个0表示Kb,6个0表示Mb,这里为10Mb-->
    <constant name="struts.multipart.maxSize" value="10000000"/>
    
    <!-- 
    package:管理action 
    name:名称,今后别的人可以继承这个package
    namespace:路径,调action的时候也要加上才能调用
    extends:继承于哪个包,这里继承于struts-default包(实现了很多struts功能)
    -->
    <package name="all" namespace="" extends="struts-default">
        <!-- 控制action中全局跳转 -->
        <global-results>
            <!-- redirectAction容器外跳转,跳action -->
            <result name="userlist" type="redirectAction">
                <param name="namespace">/user</param>
                <param name="actionName">list</param>
            </result>
        </global-results>
    </package>
    <include file="user.xml"></include>
    <include file="picture.xml"></include>
</struts>

 

/src/user.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
<package name="user" namespace="/user" extends="all">

    <!-- 通配符方式配置action,解决action太多的问题 -->
    <action name="*" class="myuser.UserAction" method="{1}">
        <!-- 控制action中局部跳转 -->
        <result name="main">${pageContext.request.contextPath}/main.jsp</result>
        <result name="login">${pageContext.request.contextPath}/login.jsp</result>
        <!-- 
            加了type="redirect"代表,容器外跳转
            容器外跳转跳不到userlist.jsp中去
            在这里只能用容器内跳转(同一个request范围之内)
        -->
        <result name="list">/WEB-INF/user/userlist.jsp</result>
        <result name="modify">/WEB-INF/user/modify.jsp</result>
    </action>
</package>
</struts>

 

5.jsp登录页面

/WebContent/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>登录</title>
<script type="text/javascript" src="jslib/jquery-1.11.1.js"></script>
<script type="text/javascript">
$(function(){
    $("[type='button']").click(function(){
        if($.trim($("[name='user.userName']").val())=="")
        {
            $("[name='user.userName']").select();
            $("[name='user.userName']").focus();
            $("#msg").html("请输入用户名!");
            return false;
        }
        if($.trim($("[name='user.pwd']").val())=="")
        {
            $("[name='user.pwd']").select();
            $("[name='user.pwd']").focus();
            $("#msg").html("请输入密码!");
            return false;
        }
        //通过jquery的方式请求action,在action中跳转也跳不走,只能在jquery中跳转
        $.post("${pageContext.request.contextPath}/user/checkLogin",{"user.userName":$("[name='user.userName']").val(),"user.pwd":$("[name='user.pwd']").val()},function(data){
            if(data=="1")
            {
                location.href="main.jsp";
            }
            else
            {
                $("#msg").html("用户名和密码错误,请重新输入!");
            }
        });
    });
});
</script>
</head>
<body>
用户登陆
<br>
<br>
<form>
<table>
<tr><td>用户名:</td><td><input type="text" name="user.userName"></td></tr>
<tr><td>密码:</td><td><input type="password" name="user.pwd"></td></tr>
<tr><td colspan="2"><input type="button" value="提交"></td></tr>
</table>
</form>
<div id="msg"></div>
<br>
<br>
<a href="${pageContext.request.contextPath}/main.jsp">返回主页面</a>
</body>
</html>
posted @ 2018-07-12 09:50  塔卡哈西KSK  阅读(169)  评论(0编辑  收藏  举报