Struts2框架速成

搭建环境

在netbean里创建一个库文件包含Struts2所必需的jar包
在web.xml插入语句

 <filter>
        <filter-name>struts2</filter-name>
        <filter-class>
            org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
        </filter-class> 
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

在源包下创建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>
    <package name="default" namespace="/" extends="struts-default">
        <!--name设置id 后面对应的类为action类-->
        <action name="hello" class="action.HelloAction">
            <result name="hello">/hello.jsp</result>
        </action>
    </package>
</struts>

创建一个hello类


package action;

public class HelloAction {
        public String execute(){
                return "hello";//对应  <result name="hello">/hello.jsp</result> 就会跳到hello.jsp
        }
}

创建jsp


<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>Hello struts2!</h1>
    </body>
</html>

运行测试

获取表单数据 简单例子

实现简单的网页求和例子
写一个表单(此处没有用到任何struts的东西)
input.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>两数求和</title>
    </head>
    <body>
        <form action="add" method="post">
            请输入两个数:<br><br>
            加数<input name="x"/><br><br>
            被加数<input name="y"/><br><br>
            <input type="submit" value="提交">
        </form>
    </body>
</html>

定义正数和负数显示的jsp网页

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        和为负数:<s:property value="sum"/>
    </body>
</html>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        和为正数:<s:property value="sum"/>
    </body>
</html>

注意用到了struts定义的标签,需要先加入该语句导入

<%@taglib prefix="s" uri="/struts-tags" %>

s:property value 访问Action值栈中的普通属性

编写action(最为关键的步骤)


package action;


public class SumAction {
    private int x;
    private int y;
    private int sum;
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
    public int getSum() {
        return sum;
    }
    public String execute(){
        sum=x+y;
        if(sum>=0) return "+";
        else return "-";
    }
}

和spring一样写完类就在struts.xml配置文件加入该类的信息
注意这里action name必须和表单的一致

<action name="add" class="action.SumAction">
            <result name="+">/Negative.jsp</result>
            <result name="-">/Positive.jsp</result>
</action>

action实现的几种方法

普通类实现

接口实现(推荐使用)

前面实现的类可修改成


package action;

import com.opensymphony.xwork2.Action;


public class SumAction implements Action{
    private int x;
    private int y;
    private int sum;
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
    public int getSum() {
        return sum;
    }
    @Override
    public String execute(){
        sum=x+y;
        if(sum>=0) return "+";
        else return "-";
    }
}

继承ActionSupport类实现


其他实现方法考试应该不考。

struts接受参数的3种方法

属性驱动

就是上面简单例子使用的方法

对象驱动(重点)


改造上一个例子:
写一个ADD类


package JavaBean;


public class Add {
    private int x;
    private int y;

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int sum(){
        return x+y;
    }
    
}

重写action类


package action;

import JavaBean.Add;
import com.opensymphony.xwork2.Action;


public class SumAction2 implements Action{
    private Add s;
    private int sum;

    public Add getS() {
        return s;
    }

    public void setS(Add s) {
        this.s = s;
    }

    public int getSum() {
        return sum;
    }
    
    @Override
    public String execute() throws Exception {
       sum=s.sum();
       if(sum>=0) return "+";
       else return "-";
    }
}

因为用到了类,表单代码也需要修改(使用s.x s.y)

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>两数求和</title>
    </head>
    <body>
        <form action="add" method="post">
            请输入两个数:<br><br>
            加数<input name="s.x"/><br><br>
            被加数<input name="s.y"/><br><br>
            <input type="submit" value="提交">
        </form>
    </body>
</html>

修改配置内容

<action name="add" class="action.SumAction2">
            <result name="+">/Negative.jsp</result>
            <result name="-">/Positive.jsp</result>
        </action>

action实现多方法

在配置文件中为method字段赋值即可实现

OGNL表达式(重点)


注意context包含的内容访问需要加#

简单来说在action定义的变量,类可以直接访问
request,session等中的值需要加#去访问

使用OGNL访问LIST

写一个测试action

package action;

import com.opensymphony.xwork2.Action;
import java.util.ArrayList;
import java.util.List;

public class ListAction implements Action{
    private List list=new ArrayList();
    @Override
    public String execute() throws Exception {
        list.clear();
        list.add(1);
        list.add("hhh");
        list.add("sdasada");
        return "success";
    } 

    public List<Object> getList() {
        return list;
    }

    public void setList(List<Object> list) {
        this.list = list;
    }
}

配置文件内容

<action name="list" class="action.ListAction">
            <result name="success">/list.jsp</result>
</action>

list.jsp
由于是action定义的属性 不需要加#

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <s:iterator value="list" var="var">
            <s:property value="var"/><br>
        </s:iterator>
    </body>
</html>

s:if标签

语法

struts的表单标签

实现简单DAO项目

项目功能:实现一个对学生数据表的简单操作 表中有sno,sname,sage3个字段
定义学生类:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package JavaBean;

/**
 *
 * @author 郑佳杰
 */
public class Student {
    private String sno;
    private String sname;
    private int sage;

    public String getSno() {
        return sno;
    }

    public void setSno(String sno) {
        this.sno = sno;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public int getSage() {
        return sage;
    }

    public void setSage(int sage) {
        this.sage = sage;
    }

   
    
}

定义一个数据库工具类,包含连接关闭数据库和两种类型的查询方法的定义


package DAO;

import java.sql.*;

/**
 *
 * @author 郑佳杰
 */
public class Dbutils {
    protected Connection conn = null;
    protected PreparedStatement pstmt = null;
    protected ResultSet rs = null;
    public Connection getConnection(){
        try{
            Class.forName("com.mysql.cj.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/my_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8";
            String user = "root";
            String password = "123456";
            conn = DriverManager.getConnection(url,user,password);
        }
        catch(Exception e){
            e.printStackTrace();
        }
        return conn;
    }
    
    public void closeAll(Connection conn, PreparedStatement pstmt, ResultSet rs) {
        try {
            if (rs != null) {
                rs.close();
            }
            if (pstmt != null) {
                pstmt.close();
            }
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
    //增删改操作
    public int executeUpdate(String sql, Object[] params) {
        this.getConnection();
        int result = 0;
        try {
            //3、创建prepareStatement对象
            pstmt = conn.prepareStatement(sql);
            //4、为占位符赋值
            if (null != params) {
                for (int i = 0; i < params.length; i++) {
                    pstmt.setObject(i + 1, params[i]);
                }
            }
            //5、调用方法:执行sql语句
            result = pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            this.closeAll(conn, pstmt, null);
        }
        return result;
    }
    
    //查询查找
    public ResultSet executQuery(String sql, Object[] params) {
        this.getConnection();
        try {
            //3、创建prepareStatement对象
            pstmt = conn.prepareStatement(sql);
            //4、为占位符赋值
            if (null != params) {
                for (int i = 0; i < params.length; i++) {
                    pstmt.setObject(i + 1, params[i]);
                }
            }
            //5、调用方法:执行sql语句
            rs = pstmt.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //后面具体的查询方法还需要用到rs ,所以此处最后不能关闭数据流
        return rs;
    }
    
}

定义学生DAO方法,包含对学生表的几种基本操作方法

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import JavaBean.Student;
import java.util.List;
import java.sql.*;
import java.util.ArrayList;
/**
 *
 * @author 郑佳杰
 */
public class StudentDAO {
    private Dbutils dbutils=new Dbutils();
    //查询所有学生
    public List<Student>findAllStudent(){
        String sql = "select sno,sname,sage from student";
        Object[] params = null;//params的作用就是给select语句中出现的?赋值,这里没有?故直接设置为Null
        List<Student> list = new ArrayList<>();
        ResultSet rs = dbutils.executQuery(sql, params);
        try {
            if (null != rs) {
                  //如果rs不为空,则循环将信息写入List中
                while (rs.next()) {
                    Student student = new Student();
                    student.setSno(rs.getString("sno"));
                    student.setSname(rs.getString("sname"));
                    student.setSage(rs.getInt("sage"));
                    list.add(student);
                }
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            dbutils.closeAll(dbutils.conn, dbutils.pstmt, dbutils.rs);
        }
        return list;
    }
    public Student findBySno(String sno) {
        Student student = new Student();
        String sql = "select sno,sname,sage from student where sno=?";
            //这里select语句出现一个? 需要params去给他赋值
            //故params值为函数使给的学号
        Object[] params = {sno};
        ResultSet rs = dbutils.executQuery(sql, params);
        try {
            if (null != rs) {
                if (rs.next()) {
                    student.setSno(rs.getString("sno"));
                    student.setSname(rs.getString("sname"));
                    student.setSage(rs.getInt("sage"));
                }
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            dbutils.closeAll(dbutils.conn, dbutils.pstmt, dbutils.rs);
        }
        return student;
    }
    
    public boolean isSnoExist(String sno) {
        boolean flag = false;
        String sql = "select sno,sname,sage from student where sno=?";
        Object[] params = {sno};
        ResultSet rs = dbutils.executQuery(sql, params);
        try {
            if (rs != null && rs.next()) {
                flag = true;
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        return flag;
    }
    
    public boolean insert(Student student) {
        boolean flag = false;
        String sql = "insert into student(sno,sname,sage) values(?,?,?)";
        Object[] params = {student.getSno(), student.getSname(), student.getSage()};
        return (dbutils.executeUpdate(sql, params) == 1);
//executeUpdate返回受影响的行数,如果不是1说明插入失败!
    }
    
    public boolean deleteBySno(String sno) {
        String sql = "delete from student where sno=?";
        Object[] params = {sno};
        return dbutils.executeUpdate(sql, params) == 1;
    }
    
    public boolean update(Student student) {
        String sql = "update student set sname=?,sage=? WHERE sno=?";
        Object[] params = {student.getSname(), student.getSage(), student.getSno()};
        return dbutils.executeUpdate(sql, params) == 1;
    }
}

定义两个action,一个是调用获取所有学生数据信息,并将该list保存起来用于显示,一个是包含了几个基本操作

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package action;

import DAO.StudentDAO;
import JavaBean.Student;
import com.opensymphony.xwork2.Action;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author 郑佳杰
 */
public class ShowListAction implements Action{
    List<Student> list=new ArrayList();
    private StudentDAO sd=new StudentDAO();
    @Override
    public String execute() throws Exception {
        list=sd.findAllStudent();
        return "main";
    }

    public List<Student> getList() {
        return list;
    }

    public void setList(List<Student> list) {
        this.list = list;
    }
    
}
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package action;

import DAO.StudentDAO;
import JavaBean.Student;
import com.opensymphony.xwork2.ActionSupport;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author 郑佳杰
 */
public class StudentDAOAction extends ActionSupport{
    List<Student> list=new ArrayList();
    private StudentDAO sd=new StudentDAO();
    private String sno;
    private Student student;
    private String msg;
    public Student getStudent() {
        return student;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public void setStudent(Student student) {
        this.student = student;
    }
    public String getSno() {
        return sno;
    }

    public void setSno(String sno) {
        this.sno = sno;
    }
    public List<Student> getList() {
        return list;
    }
    public void setList(List<Student> list) {
        this.list = list;
    }
    public StudentDAO getSd() {
        return sd;
    }
    public void setSd(StudentDAO sd) {
        this.sd = sd;
    }
    public String delete(){
        sd.deleteBySno(sno);
        return SUCCESS;
    }
    public String edit(){
        if(sno!=null){
            student=sd.findBySno(sno);
        }
        return SUCCESS;
    }
    public String save(){
        if(sd.insert(student)){
            return SUCCESS;
        }
        else {
            msg="insert error";
            System.out.println(msg);
            return ERROR;
        }
    }
    public String update(){
        if(sd.update(student)){
            return SUCCESS;
        }
        else{
            msg="update error";
            return ERROR;
        } 
    }
}

写两个网页,一个是主界面,一个是当更新信息或者添加信息时需要用到的一个页面

<%-- 
    Document   : main
    Created on : 2021-6-8, 20:32:22
    Author     : 郑佳杰
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <s:form >
            <table border="1" align="center">
                <tr>
                    <td>
                        学号
                    </td>
                    <td>
                        姓名
                    </td>
                    <td>
                        年龄
                    </td>
                    <td>
                        删除
                    </td>
                    <td>
                        修改
                    </td>
                </tr>
                <s:iterator value="list">
                    <tr>
                        <td>
                            <s:property value="sno"/>
                        </td>
                        <td>
                            <s:property value="sname"/>
                        </td>
                        <td>
                            <s:property value="sage"/>
                        </td>
                        <td>
                            <a href="<s:url action="delete"><s:param name="sno" value="sno"/></s:url>">删除</a>
                        </td>
                        <td>
                            <a href="<s:url action="edit"><s:param name="sno" value="sno"/></s:url>">编辑</a>
                        </td>
                    </tr>
                </s:iterator>
            </table>
        </s:form>
            
    <center>
        <a href="<s:url action="edit"></s:url>">添加</a>
    </center>
    </body>
</html>
<%-- 
    Document   : edit
    Created on : 2021-6-8, 21:54:04
    Author     : 郑佳杰
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <s:if test="student==null">
            <s:form action="save">
                <s:textfield name="student.sno" label="学号"/>
                <s:textfield name="student.sname" label="姓名"/>
                <s:textfield name="student.sage" label="年龄"/>
                <s:submit value="提交"/>
            </s:form>
        </s:if>
        <s:else>
            <s:form action="update" method="post">
                编辑信息
                <input type="hidden" name="student.sno" value="<s:property value="sno"/>">
                <s:textfield name="student.sname" label="名字"/>
                <s:textfield name="student.sage" label="名字"/>
                <s:submit value="提交"/>
            </s:form>
        </s:else>
    </body>
</html>

配置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>
    <package name="default" namespace="/" extends="struts-default">
        <!--name设置id 后面对应的类为action类-->
        <action name="hello" class="action.HelloAction">
            <result name="hello">/hello.jsp</result>
        </action>
        
        <action name="main" class="action.ShowListAction">
            <result name="main">/main.jsp</result>
        </action>
        
        <action name="edit" class="action.StudentDAOAction" method="edit">
            <result>edit.jsp</result>
        </action>
        
        <action name="delete" class="action.StudentDAOAction" method="delete">
            <result type="redirect">main</result>
        </action>
        
        <action name="update" class="action.StudentDAOAction" method="update">
            <result type="redirect" name="success">main</result>
            <result name="error">/error.jsp</result>
        </action>
        
        <action name="save" class="action.StudentDAOAction" method="save">
            <result type="redirect" name="success">main</result>
            <result name="error">/error.jsp</result>
        </action>
    </package>
</struts>

写一个出现错误时跳转的error.jsp

<%-- 
    Document   : error
    Created on : 2021-6-9, 10:40:33
    Author     : 郑佳杰
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        出现错误
        <s:property value="msg"/>
    </body>
</html>

posted @ 2021-06-07 20:32  一个经常掉线的人  阅读(104)  评论(0)    收藏  举报