用了三天的时间入门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>
本人也是一位计算机学习者,也正处于学习阶段。如有错误,请大家明确指出,大家共同学习进步。