Javaee第四次上机要求用struts来实现登录的功能。老师给了一部分代码,照着敲bug百出,做完之后感觉还是云里雾里的。写博客梳理一下。
环境准备eclipse
Mysql数据库
jar包下载(jar包我都是官网下载的,先放百度盘里,也可以用自己旧的版本) 链接: https://pan.baidu.com/s/1FFUPn8GDa96DK1XgIsOAFw 提取码: z6w3
完整的目录结构为
一、
在eclipse里面创建javaee工程,将刚刚下载的jar包拖进工程里的WebContent/WEB-INF/lib里 jar包|作用 ---|:--:|---: mysql-connector-java-5.1.47.jar|jdbc链接mysql的工具 commons-fileupload-1.3.2.jar|文件上传 commons-io-2.2.jar|IO工具类封装 commons-lang3-3.2.jar|Commons项目中用来处理java基本对象的工具类包 commons-logging-1.1.3.jar|java常用日志工具调用,如通过API调用Log4J freemarker-2.3.28.jar|模式引擎,一个基于模板生成文本输出的通用工具 javassist-3.11.0.GA.jar|编辑Java字节码的类库 ognl-3.0.21.jar|Object-Graph(用什么表达)Navigation(导航)Language,支持ognl表达式 struts2-core-2.3.36.jar|struts核心包 xwork-core-2.3.36.jar|模式引擎,一个基于模板生成文本输出的通用工具 转载自CSDN博客:struts2各个jar包的作用 导入后结果:
二、
在WebContent里创建jsp文件 index.jsp
Insert title heresuccess.jsp
Insert title here欢迎!
fail.jsp
Insert title herefailed!
这里使用了struts的标签库,使用前需要导入struts的核心jar包struts2-core-2.3.36.jar,使用struts的标签库,可以丰富页面的表现效果。我试着删除掉,页面就变空白。 **标签库知识拓展博客:** 1. [struts标签地址问题](https://blog.csdn.net/master_yao/article/details/50195733) 2. [java开发--struts2 标签库使用](https://www.cnblogs.com/wanghuaijun/p/5278316.html) 3. [Struts2标签库常用标签](https://blog.csdn.net/q547550831/article/details/53326042) ## 三、 在WenContent创建web.xml,配置web项目启动时加载的信息 web.xml
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
index.jsp
web.xml解释 1. 最外层用web-app包住多个加载项 2. 制定欢迎界面,例如:
index.jsp
index1.jsp
PS:指定了2个欢迎页面,显示时按顺序从第一个找起,如果第一个存在,就显示第一个,后面的不起作用。如果第一个不存在,就找第二个,以此类推。 3. 设置过滤器:比如设置一个编码过滤器,过滤所有资源
XXXCharaSetFilter
net.test.CharSetFilter
XXXCharaSetFilter
/*
四、
在Java Resources/src下创建包com.struts 在com.struts下创建DBUtility.java、LoginAction.java DBUtility.java
package com.struts;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class DBUtility {
//直连数据库 public Connection getConnection(){
try{
Class.forName("com.mysql.jdbc.Driver");
return DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatebase","root","123456");
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}
return null;
}
//通过参数连接数据库 public Connection getConnection(String url,String username,String pwd){
try{
Class.forName("com.mysql.jdc.Driver");
return DriverManager.getConnection(url,username,pwd);
} catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}
return null;
}
//通过配置文件DBConfig.properties连接数据库 public Connection openConnection(){
Properties prop=new Properties();
String driver=null;
String username=null;
String url=null;
String pwd=null;
try{
prop.load(this.getClass().getClassLoader().getResourceAsStream("DBConfig.properties"));
driver=prop.getProperty("driver");
url=prop.getProperty("url");
username=prop.getProperty("username");
pwd=prop.getProperty("pwd");
Class.forName(driver);
return DriverManager.getConnection(url,username,pwd);
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
return null;
}
//关闭数据库 public void closeConn(Connection conn){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block System.out.println("数据库关闭异常");
e.printStackTrace();
}
}
}
LoginAction.java
package com.struts;
import com.opensymphony.xwork2.ActionSupport;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
public class LoginAction extends ActionSupport{
private String userName;
private String password;
//连接数据库配对账号密码 public String execute() {
//定义变量i,记录匹配到的记录数量 int i=0;
DBUtility util=new DBUtility();
Connection conn=util.getConnection();
//通过用户在表单中的输入,查找数据库表 String sql = "select uid from mydatebase.login where userName='"+this.userName.toString()+"' and password='"+this.password.toString()+"'";
try{
//防止空指针异常 if(conn!=null)
{
System.out.println("connect successfully!");
java.sql.Statement stmt=conn.createStatement();
ResultSet rs= stmt.executeQuery(sql);
while(rs.next()){
//通常只有一个用户记录 i++;
}
}
}catch (SQLException e) {
e.printStackTrace();
} finally {
if(conn!=null)
util.closeConn(conn);
}
//这里的返回结果在struts.xml文件里用到,涉及到页面的跳转 if(i>0){
return "success";
}
else{
return "fail";
}
}
//get和set方法由eclipse自动生成 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;
}
}
五、
连接数据库需要额外的配置文件 在Java Resources/src下创建DBConfig.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/mydatebaseusername=root
pwd=123456
六、
在Java Resources/src下创建struts.xml
/p>
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
/success.jsp
/fail.jsp
主要属性说明: 属性|说明 ---|:--:|---: package-name|用于区别不同的package;必须是唯一的、可用的变量名;用于其它package来继承; package--namespace|用于减少重复代码(和struts1比较);包的namespace属性用于定义该包的命名空间,命名空间作用为访问该包下的action路径的一部分。namespace属性可以不配置,如果不指定该属性,默认的命名空间为””。 package--extends|用于继承其它package以使用里面的过滤器等东西; action--name|用于在一个package里区别不同的action;必须是唯一的、可用的变量名;是调用action时输入路径的组成部分; action--class|action所在的路径(包名+类名); action--method|action所调用的方法名;默认值为method=”execute”;也可以时其他方法;通常每个包都应该继承struts-default包,因为struts2很多核心功能都是拦截来实现的。如从请求中把请求参数封闭到action、文件上传和数据验证等都是通过拦截器实现的。 struts-default定义了这些拦截器和Result类型,可以这么说,当包继承了struts-default才能使用struts2提供的核心功能,struts-default包是在struts2-core-2.xx.jar文件中的struts-defalut.xml中定义。struts-default.xml也是struts2默认配置文件,struts2每次都会自动加载struts-default.xml文件。
namespace具体使用 参考博客:Struts2:命名空间的使用
本篇很多内容都是参考下面这篇文章 博主:dutsoft Struts2实现登陆功能Demo
七、
在Mysql数据库中创建mydatebase数据库 并通过sql脚本创建login表
create table login
(
uid int primart key,
userName varchar(100) not null,
password varchar(100) not null
)
通过图形化界面随意在表中添加几行记录
最后记得点apply
八、
最后结果
九、解决404报错
可能原因有: 1. 需要的jar包没有导入 2. 路径没有写对