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>

浙公网安备 33010602011771号