1. Struts2处理传入多个值
- 多个字符串参数传入后台
关键代码:
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="helloworld" extends="struts-default">
<action name="hobby" class="com.bee.action.HobbyAction">
<result name="success">success.jsp</result>
</action>
</package>
</struts>
HobbyAction.java
public class HobbyAction implements Action {
private String[] hobby;
public String[] getHobby() {
return hobby;
}
public void setHobby(String[] hobby) {
this.hobby = hobby;
}
@Override
public String execute() throws Exception {
System.out.println("执行了Action的默认方法");
if (hobby != null) {
for (String h : hobby) {
System.out.println(h);
}
}
return SUCCESS;
}
}
hobby.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="hobby" method="post">
爱好:
<input type="checkbox" name="hobby" value="唱歌"/>唱歌
<input type="checkbox" name="hobby" value="跳舞"/>跳舞
<input type="checkbox" name="hobby" value="睡觉"/>睡觉
<input type="checkbox" name="hobby" value="玩CF"/>玩CF
<input type="submit" value="提交"/>
</form>
</body>
</html>
- 多个JavaBean参数传入后台
关键代码:
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="helloworld" extends="struts-default">
<action name="student" class="com.bee.action.StudentAction">
<result name="success">success.jsp</result>
</action>
</package>
</struts>
Student.java
public class Student {
private String name;
private String sex;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
}
StudentAction.java
public class StudentAction implements Action {
private List<Student> students;
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
@Override
public String execute() throws Exception {
System.out.println("执行了Action的默认方法");
for (Student s : students) {
System.out.println(s);
}
return SUCCESS;
}
}
addstudents.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="student" method="post">
<table>
<tr>
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
</tr>
<tr>
<td><input type="text" name="students[0].name"/></td>
<td><input type="text" name="students[0].sex"/></td>
<td><input type="text" name="students[0].age"/></td>
</tr>
<tr>
<td><input type="text" name="students[1].name"/></td>
<td><input type="text" name="students[1].sex"/></td>
<td><input type="text" name="students[1].age"/></td>
</tr>
<tr>
<td colspan="3">
<input type="submit" value="提交"/>
</td>
</tr>
</table>
</form>
</body>
</html>
2. struts.xml的配置
- package标签
name 标识包。项目分包(模块化组织),package包含action标签。即可以并列多个package标签。
extends 继承
namespace 包命名空间。指定的值将作为URL中action标签中name定义的访问路径的前缀。值的形式 namespace="/fore"。
比如:
<package name="helloworld" namespace="/fore" extends="struts-default">
<action name="user" class="com.bee.action.UserAction">
<result name="success">success.jsp</result>
</action>
</package>
则访问的URL为 http://localhost:8080/ProjectName/fore/user
注意:success.jsp的URL变为了 http://localhost:8080/ProjectName/fore/success.jsp
如果success.jsp在WebContent目录下,则要写作:
<result name="success">${pageContext.request.contextPath}/success.jsp</result>
abstract 抽象包,主要用于其他包来继承它。
<package name="infoFilter" abstract="true"></package>
- action标签
name 定义URL的访问路径。
class 请求处理类
method 指定Action处理类中是哪个方法来处理http请求。
<package name="background" namespace="/back" extends="struts-default">
<action name="studentList" class="com.bee.action.BackStudent" method="show">
<result name="success">${pageContext.request.contextPath}/success.jsp</result>
</action>
</package>
指定com.bee.action.BackStudent类中的show()方法来处理 /back/studentList 请求。
3. struts.xml分模块的配置方法
-
配置文件
-
配置内容
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 ...>
<action ...>
</action>
<action ...>
</action>
...
</package>
<include file="cheliang.xml"></include>
<include file="zichan.xml"></include>
</struts>
cheliang.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="cheliang" namespace="/cheliang" extends="struts-default">
<action name="cheliang" class="com.bee.action.CheLiangAction">
<result name="success">${pageContext.request.contextPath}/success.jsp</result>
<!-- 一启用namespace,jsp的位置就需要如上设定 -->
</action>
</package>
</struts>
zichan.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="zichan" namespace="/zichan" extends="struts-default">
<action name="zichan" class="com.bee.action.ZiChanAction">
<result name="success">${pageContext.request.contextPath}/success.jsp</result>
<!-- 一启用namespace,jsp的位置就需要如上设定 -->
</action>
</package>
</struts>
测试结果
4. 使用通配符
- 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="helloworld" extends="struts-default">
<action name="hello" class="com.bee.action.HelloWorldAction2">
<result name="success">helloworld.jsp</result>
</action>
<action name="user" class="com.bee.action.UserAction">
<result name="success">success.jsp</result>
<result name="error">error.jsp</result>
</action>
...
</package>
<!-- package的name仅是用于标识区分。默认名字空间namespace="/" -->
<package name="manage" extends="struts-default">
<action name="Student_*"
class="com.bee.action.StudentAction" method="{1}">
<!--这里的{1}就是前边通配符*所指代的内容-->
<result name="success">success.jsp</result>
</action>
<action name="Grade_*" class="com.bee.action.GradeAction"
method="{1}">
<!--这里的{1}就是前边通配符*所指代的内容-->
<result name="success">success.jsp</result>
</action>
</package>
</struts>
- success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
登录成功! ${name }
</body>
</html>
- index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>通配符</title>
</head>
<body>
<h1>通配符</h1>
<a href="Student_list" target="_blank">学生信息查询</a>
<a href="Student_add" target="_blank">学生信息添加</a>
<a href="Student_update" target="_blank">学生信息修改</a>
<a href="Student_delete" target="_blank">学生信息删除</a>
<br/><br/>
<a href="Grade_list" target="_blank">班级信息查询</a>
<a href="Grade_add" target="_blank">班级信息添加</a>
<a href="Grade_update" target="_blank">班级信息修改</a>
<a href="Grade_delete" target="_blank">班级信息删除</a> <br/>
</body>
</html>
- GradeAction.java
package com.bee.action;
import com.opensymphony.xwork2.ActionSupport;
public class GradeAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String list() throws Exception {
System.out.println("班级查找");
name = "班级查找";
return SUCCESS;
}
public String add() throws Exception {
System.out.println("班级添加");
name = "班级添加";
return SUCCESS;
}
public String update() throws Exception {
System.out.println("班级修改");
name = "班级修改";
return SUCCESS;
}
public String delete() throws Exception {
System.out.println("班级删除");
name = "班级删除";
return SUCCESS;
}
}
- StudentAction.java
package com.bee.action;
import com.opensymphony.xwork2.ActionSupport;
public class StudentAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String list() throws Exception {
System.out.println("学生查找");
name = "学生查找";
return SUCCESS;
}
public String add() throws Exception {
System.out.println("学生添加");
name = "学生添加";
return SUCCESS;
}
public String update() throws Exception {
System.out.println("学生修改");
name = "学生修改";
return SUCCESS;
}
public String delete() throws Exception {
System.out.println("学生删除");
name = "学生删除";
return SUCCESS;
}
}
- 通配符的另一种形式(struts.xml中配置)
<package name="manage" extends="struts-default">
<action name="*_*" class="com.bee.action.{1}Action"
method="{2}">
<!-- 上边的{1}指代第一个通配符*,{2}指代第二个通配符* -->
<result name="success">success.jsp</result>
</action>
</package>
- 一个小问题的处理
eclipse右下角
如何关闭优化掉它?
菜单->Window->Preferences
可以取消:
DTD Validator,XML Schema Validator,XML Validator。
5. 动态方法调用(不推荐使用)
- 在struts.xml中配置启用动态方法调用并配置url与Action类的映射
<?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 ...>
<action ...>
</action>
<action ...>
</action>
...
</package>
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<package name="manage" extends="struts-default">
<action name="student"
class="com.bee.action.StudentAction">
<result name="success">success.jsp</result>
</action>
<action name="grade" class="com.bee.action.GradeAction">
<result name="success">success.jsp</result>
</action>
</package>
</struts>
- 在html中使用“!”调用ActionSupport类方法
<h1>动态方法调用</h1>
<a href="student!list" target="_blank">学生信息查询</a>
<a href="student!add" target="_blank">学生信息添加</a>
<a href="student!update" target="_blank">学生信息修改</a>
<a href="student!delete" target="_blank">学生信息删除</a>
<br/><br/>
<a href="grade!list" target="_blank">班级信息查询</a>
<a href="grade!add" target="_blank">班级信息添加</a>
<a href="grade!update" target="_blank">班级信息修改</a>
<a href="grade!delete" target="_blank">班级信息删除</a> <br/>
href中的!可以直接调用ActionSupport子类中定义的方法。比如student!list
可以调用StudentAction类的如下方法:
public String list() throws Exception {
System.out.println("学生查找");
name = "学生查找";
return SUCCESS;
}
6. Action的生命周期
每次url对Action的请求都会产生一个新的Action实例。
- struts.xml
<package name="manage" extends="struts-default">
<action name="hello" class="com.bee.action.HelloAction">
<result name="success">success.jsp</result>
</action>
</package>
- HelloAction.java
public class HelloAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
public HelloAction() {
System.out.println(this); //每次产生不同的实例
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
println(this)的输出如下:
com.bee.action.HelloAction@625cf813
com.bee.action.HelloAction@2779c058
com.bee.action.HelloAction@3958fb5d
com.bee.action.HelloAction@d64c3a4
发现是不同的实例。