java+Intellij IDEA+struts2+Tomcat+Mysql+easyui小项目

用了三天的时间入门struts2。用了所学的知识做了个小项目,登录后实现文件下载和上传的功能。

改项目适合刚刚入门struts2的人看看,最好也能跟着打。不懂easyui没关系,我只用了一点点。

我觉得重要的地方都有备注,不懂可以看看

觉得有帮助的可以评论一下,激励下我

版本struts2:2.3.16.3


这是目录

model包下的

package com.xu.model;

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

    public User() {
    }

    public User(String userName, String password) {
        this.userName = userName;
        this.password = password;
    }

    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;
    }
}

dao包

package com.xu.dao;

import com.xu.model.User;

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

public class UserDao {

    public int  userAdd(Connection con, User user) {
        String sql = "insert into db_jsp values(null,?,?)";
        PreparedStatement pstmt = null;
        try {
            pstmt = con.prepareStatement(sql);
            pstmt.setString(1, user.getUserName());
            pstmt.setString(2, user.getPassword());
            return pstmt.executeUpdate();
        } catch (SQLException e) {
            System.out.println("error  userAdd");
            e.printStackTrace();
            return 0;
        }
    }

    public User  login(Connection con, User user) {
        String sql = "select * from db_jsp where userName=? and password=?";
        PreparedStatement pstmt = null;
        try {
            pstmt = con.prepareStatement(sql);
            pstmt.setString(1, user.getUserName());
            pstmt.setString(2, user.getPassword());
            ResultSet rs = pstmt.executeQuery();
            User currentUser=null;
            if (rs.next()) {
                currentUser = new User(rs.getString("userName"), rs.getString("password"));
            }
            return currentUser;
        }
         catch (SQLException e) {
            System.out.println("error  UserDao>login");
            e.printStackTrace();
            return null;
        }
    }



}

util包

package com.xu.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DbUtil {

    private String dbUrl="jdbc:mysql://127.0.0.1:3306/db_jsp?useUnicode=true&characterEncoding=utf-8";
    private String dbUsername="root";
    private String dbPassword="";
    private String jdbcName="com.mysql.jdbc.Driver";

    public Connection getCon(){
        Connection con=null;
        try{
            Class.forName(jdbcName);
             con= DriverManager.getConnection(dbUrl,dbUsername,dbPassword);
        } catch (ClassNotFoundException e) {
            System.out.println("error  Class.forName(jdbcName);");
            e.printStackTrace();
        } catch (SQLException e) {
            System.out.println("error   Connection con= DriverManager.getConnection(dbUrl,dbUsername,dbPassword);");
            e.printStackTrace();
        }
        return con;
    }

    public void closeCon(Connection con){
        if(con!=null){
            try {
                con.close();
            } catch (SQLException e) {
                System.out.println("error   con.close();");
                e.printStackTrace();
            }
        }
    }


    public static void main(String[] args) {
        DbUtil db=new DbUtil();
        db.getCon();
    }



}

这个工具类在这里没有使用,这是一直习惯吧。

package com.xu.util;

public class StringUtil {
    public static boolean isEmpty(String str){
        if("".equals(str)||str==null){
            return  true;
        }
        else{
            return false;
        }
    }

    public static boolean isNotEmpty(String str){
        if(!"".equals(str)&&str!=null){
            return  true;
        }
        else{
            return false;
        }
    }

}
interceptor包

这是拦截器,不能让用户没有登录就直接进去主页面

package com.xu.interceptor;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

public class LoginInterceptor implements Interceptor {

    @Override
    public void destroy() {

    }

    @Override
    public void init() {
    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("在Action执行之前");
        ActionContext actionContext=invocation.getInvocationContext();
        Map<String, Object> session=actionContext.getSession();//获取session 登录后就设置currentUser
        Object currentUser=session.get("currentUser");
        String result=null;
        if(currentUser!=null){
            result=invocation.invoke();
        }else{
            HttpServletRequest request=(HttpServletRequest)invocation.getInvocationContext().get(ServletActionContext.HTTP_REQUEST);
            request.setAttribute("error", "请先登录!");//在登录页面的提示信息
            result="error";
        }
        System.out.println("result:"+result);
        System.out.println("在Action执行之后");
        return result;
    }
}
validators包这是验证器,用来弄注册时用户名不能有某些字
package com.xu.validators;

import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;

public class SensitiveWordValidators extends FieldValidatorSupport {

    @Override
    public void validate(Object o) throws ValidationException {
        String fieldName=this.getFieldName();//看文档写的
        String value=this.getFieldValue(fieldName,o).toString();
        if(!check(value)){
            this.addFieldError(fieldName,o);
        }
    }

    public boolean check(String value){
     String sensitiveWords[]={"操","你妈","你妹"};
     for(int i=0;i<sensitiveWords.length;i++){
         if(value.indexOf(sensitiveWords[i])>-1){
             return false;
         }
     }
     return true;
    }
}

action包

package com.xu.action;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

import java.io.File;
import java.io.FileInputStream;
import java.io.UnsupportedEncodingException;
import java.util.Map;

public class FileDownloadAction extends ActionSupport {

    private String fileName;

    public String getFileName() throws UnsupportedEncodingException {
        fileName=new String(fileName.getBytes(),"ISO8859-1");//如果没有,下载后的名字是乱码
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    //这里不是execute方法
    public FileInputStream getInputStream()throws Exception{
        File file=new File("D:/一曲相思-阿悠悠.mp3");
        this.fileName = "一曲相思-阿悠悠.mp3";
        return new FileInputStream(file);
    }
}
package com.xu.action;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.util.Map;

public class FileUploadAction extends ActionSupport {
    private File uploadFile;//这里的名字有要求,必须是在jsp页面<input type="file" name="uploadFile">的name
    private String uploadFileFileName;//这是的名字是上面的+FileName 下面类似
    private String uploadFileContentType;

    public File getUploadFile() {
        return uploadFile;
    }

    public void setUploadFile(File uploadFile) {
        this.uploadFile = uploadFile;
    }

    public String getUploadFileFileName() {
        return uploadFileFileName;
    }

    public void setUploadFileFileName(String uploadFileFileName) {
        this.uploadFileFileName = uploadFileFileName;
    }

    public String getUploadFileContentType() {
        return uploadFileContentType;
    }

    public void setUploadFileContentType(String uploadFileContentType) {
        this.uploadFileContentType = uploadFileContentType;
    }

    @Override
    public String execute() throws Exception {
        System.out.println("文件名:"+uploadFileFileName);
        System.out.println("文件类型:"+uploadFileContentType);
        String filePath="D:/"+uploadFileFileName;
        File saveFile=new File(filePath);
        FileUtils.copyFile(uploadFile,saveFile);
//        ActionContext actionContext=ActionContext.getContext();
//        Map<String, Object> session=actionContext.getSession();
        Map<String, Object> request = (Map)ActionContext.getContext().get("request");//这里应该用request提示
        request.put("msg","上传成功");
        return SUCCESS;
    }
}

我没有弄server类最好还是弄一个封装一下,我这里没有

package com.xu.action;

import com.mysql.cj.x.protobuf.MysqlxNotice;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.xu.dao.UserDao;
import com.xu.model.User;
import com.xu.util.DbUtil;

import java.sql.Connection;
import java.util.Map;

public class LoginAction extends ActionSupport {
    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public String execute()  {
        if(user!=null){
            Connection con=null;
            DbUtil dbUtil=new DbUtil();
            con=dbUtil.getCon();
            UserDao userDao=new UserDao();
            User currentUser=userDao.login(con,user);
            if(currentUser!=null){
                ActionContext actionContext=ActionContext.getContext();
                Map<String, Object> session=actionContext.getSession();
                session.put("currentUser",user);
                dbUtil.closeCon(con);
                return SUCCESS;
            }
            else{
                ActionContext actionContext=ActionContext.getContext();
                Map<String, Object> session=actionContext.getSession();
                session.put("error","密码或用户名错误");
                dbUtil.closeCon(con);//记得关掉
                return "error";
            }
        }
            return null;
    }
}

验证器 名字是有要求的!!!!   xxx+validation.xml   xxx是你要验证的action

LoginAction-validation.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
    <field name="user.userName">
        <field-validator type="requiredstring">
            <message>请输入用户名</message>
        </field-validator>
        <field-validator type="stringlength">
            <param name="minLength">6</param>
            <param name="maxLength">10</param>
            <message>用户名必须在${minLength}和${maxLength}之间</message>
        </field-validator>
    </field>
</validators>
package com.xu.action;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.xu.dao.UserDao;
import com.xu.model.User;
import com.xu.util.DbUtil;

import java.sql.Connection;
import java.util.Map;

public class ZuceAction extends ActionSupport {
    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public String execute() throws Exception {
        if(user!=null){
            Connection con=null;
            DbUtil dbUtil=new DbUtil();
            con=dbUtil.getCon();
            UserDao userDao=new UserDao();
            User currentUser=userDao.login(con,user);
            if(currentUser!=null){
                dbUtil.closeCon(con);
                return "error";
            }
            else{
                userDao.userAdd(con,user);
                dbUtil.closeCon(con);
                return SUCCESS;
            }
        }
        return null;
    }
}

验证器,有我的自定义验证器

<?xml version='1.0' encoding='UTF-8'?>

<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
    <field name="user.userName">
        <field-validator type="requiredstring">
            <message>请输入用户名</message>
        </field-validator>
        <field-validator type="stringlength">
            <param name="minLength">6</param>
            <param name="maxLength">10</param>
            <message>用户名必须在${minLength}和${maxLength}之间</message>
        </field-validator>
        <!--下面这个验证器是我自定义的验证器,后面会说-->
        <field-validator type="sensitive">
            <message>有敏感词汇</message>
        </field-validator>
    </field>

    <field name="user.password">
        <field-validator type="requiredstring">
            <message>请输入密码</message>
        </field-validator>
        <field-validator type="stringlength">
            <param name="minLength">6</param>
            <param name="maxLength">12</param>
            <message>用户名必须在${minLength}和${maxLength}之间</message>
        </field-validator>

    </field>
</validators>

这是为了弄拦截器才弄的一个action

package com.xu.action;

import com.opensymphony.xwork2.ActionSupport;
import com.xu.model.User;

public class MainAction extends ActionSupport {
    private User user;

    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }
}

validators.xml  

这个文件是要去struts-2.3.16.3找到的,可以在官方下载  后缀是all的那个。

想要自定义验证器就直接在最后加上

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator Config 1.0//EN"
        "http://struts.apache.org/dtds/xwork-validator-config-1.0.dtd">
<validators>
    <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
    <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
    <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
    <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
    <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
    <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
    <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
    <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
    <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
    <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
    <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
    <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
    <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
    <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
    <!--上面是系统自带的验证器,下面是我定义的-->
    <validator name="sensitive" class="com.xu.validators.SensitiveWordValidators"/>
</validators>

struts.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">


<struts>
    <!--设置最大上传大小-->
    <constant name="struts.multipart.maxSize" value="20000000"></constant>

    <package name="manager" extends="struts-default">


        <interceptors>
            <interceptor name="loginInterceptor" class="com.xu.interceptor.LoginInterceptor"></interceptor>
            <interceptor-stack name="myStack">
                <interceptor-ref name="loginInterceptor"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>



        
        <action name="zuce" class="com.xu.action.ZuceAction">
            <result name="input">zuce.jsp</result>
            <result name="error">zuce.jsp</result>
            <result name="success">index.jsp</result>

        </action>

        <action name="login" class="com.xu.action.LoginAction">
            <result name="input">index.jsp</result>
            <result name="success">main.jsp</result>
            <result name="error">index.jsp</result>
            <!--防止重复提交-->
            <interceptor-ref name="tokenSession"></interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>

        <action name="main" class="com.xu.action.MainAction">
            <result name="success">main.jsp</result>
            <result name="error">index.jsp</result>
            <interceptor-ref name="loginInterceptor"></interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>


        <action name="upload" class="com.xu.action.FileUploadAction">
            <result name="success">main.jsp</result>
            <result name="input">mian.jsp</result>
        </action>


        <action name="download" class="com.xu.action.FileDownloadAction">
            <result type="stream">
                <param name="contentDisposition">attachment;filename=${fileName}</param>
            </result>
        </action>


    </package>
</struts>

jsp文件

引入的东西是easyui框架

登录界面

<%--
  Created by IntelliJ IDEA.
  User: xu
  Date: 2019/2/10
  Time: 21:56
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <meta charset="UTF-8">
    <title>用户登录</title>
    <link rel="stylesheet" type="text/css" href="./jquery-easyui-1.3.3/themes/default/easyui.css">
    <link rel="stylesheet" type="text/css" href="./jquery-easyui-1.3.3/themes/icon.css">
    <link rel="stylesheet" type="text/css" href="./jquery-easyui-1.3.3/demo/demo.css">
    <script type="text/javascript" src="./jquery-easyui-1.3.3/jquery.min.js"></script>
    <script type="text/javascript" src="./jquery-easyui-1.3.3/jquery.easyui.min.js"></script>
    <script type="text/javascript" src="./jquery-easyui-1.3.3/locale/easyui-lang-zh_CN.js"></script>
    <%@taglib prefix="s" uri="/struts-tags" %>
    <title>登录</title>
  </head>
  <body>
  <div class="easyui-panel" title="登录" style="width:400px">
   <font color="red">${error}</font>
    <div style="padding:10px 0 10px 60px">
        <s:form action="login" method="post">
            <s:token></s:token>
        <table>
          <tr>
            <td>用户名:</td>
            <td>
              <s:textfield type="text" name="user.userName" ></s:textfield>
             </td>
          </tr>
          <tr>
            <td>密码:</td>
            <td> <s:textfield type="password" name="user.password" ></s:textfield>  <s:submit value="登录"></s:submit><a href="zuce.jsp" class="easyui-linkbutton"  >注册</a></td>
          </tr>
            <tr>
                <td> </td>
                <td></td>
            </tr>


        </table>



        </s:form>
    </div>
  </div>
  </body>
</html>

注册

<%--
  Created by IntelliJ IDEA.
  User: xu
  Date: 2019/2/11
  Time: 10:21
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户注册</title>
    <meta charset="UTF-8">
    <link rel="stylesheet" type="text/css" href="./jquery-easyui-1.3.3/themes/default/easyui.css">
    <link rel="stylesheet" type="text/css" href="./jquery-easyui-1.3.3/themes/icon.css">
    <link rel="stylesheet" type="text/css" href="./jquery-easyui-1.3.3/demo/demo.css">
    <script type="text/javascript" src="./jquery-easyui-1.3.3/jquery.min.js"></script>
    <script type="text/javascript" src="./jquery-easyui-1.3.3/jquery.easyui.min.js"></script>
    <script type="text/javascript" src="./jquery-easyui-1.3.3/locale/easyui-lang-zh_CN.js"></script>
    <%@taglib prefix="s" uri="/struts-tags" %>
</head>
<body>
<div class="easyui-panel" title="注册" style="width:400px">
    <font color="red">${error}</font>
    <div style="padding:10px 0 10px 60px">
        <s:form action="zuce" method="post">
            <s:token></s:token>
            <table>
                <tr>
                    <td>用户名:</td>
                    <td>
                        <s:textfield type="text" name="user.userName" ></s:textfield>
                    </td>
                </tr>
                <tr>
                    <td>密码:</td>
                    <td> <s:textfield type="password" name="user.password" ></s:textfield>  <s:submit value="注册"></s:submit></td>
                </tr>
                <tr>
                    <td> </td>
                    <td></td>
                </tr>
            </table>
        </s:form>
    </div>
</div>
</body>
</html>

主界面

<%--
  Created by IntelliJ IDEA.
  User: xu
  Date: 2019/2/10
  Time: 22:51
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
${msg}
<form action="upload" method="post" enctype="multipart/form-data">
    文件上传:<input type="file" name="uploadFile">
    <input type="submit" value="提交">
</form>
<br>
<a href="download">文件下载</a>
</body>
</html>

本人也是一位计算机学习者,也正处于学习阶段。如有错误,请大家明确指出,大家共同学习进步。

猜你喜欢

转载自blog.csdn.net/xu505928168/article/details/86989040
今日推荐