Struts2基础

来源:互联网 发布:对上知教育的评价 编辑:程序博客网 时间:2024/06/03 22:07

Struts2 用户请求和模块化处理以及页面的展现更合适

8个jar包xwork-core-2.3.16.3   struts2-core-2.3.16.3  ognl-3.0.6  javassist-3.11.0.GA   freemarker-2.3.19  commons-lang3-3.1  commons-io-2.2  commons-fileupload-1.3.1

拦截用户请求交给struts2处理

<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>


用户请求一个地址通过struts2处理返回页面

<?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"> package包 name给包取名 有很多包可以取很多名字 background 
  <action name="hello" class="com.java1234.action.HelloWorldAction"> 请求要请求hello 
  <result name="success">helloWorld.jsp</result> 返回 name刚才返回的是success public static final String SUCCESS="success"; 跳转地址默认是转发
  </action>
 
 
  </package>


</struts>


package com.java1234.action;


import com.opensymphony.xwork2.Action;


public class HelloWorldAction implements Action{ 实现功能接口


@Override
public String execute() throws Exception { execute方法中定义静态字段 Success
System.out.println("执行了Action的默认方法");
return SUCCESS;
}


}



自动get set获取设置素具

package com.java.action;


import com.opensymphony.xwork2.Action;


public class HelloWorldAction implements ActionSupport{


private String name;


public String getName() {
return name;
}


public void setName(String name) {
this.name = name;
}

@Override
public String execute() throws Exception {
System.out.println("执行了Action的默认方法");
return SUCCESS;
}


}


<%@ 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>

http://localhost:8080/HeadFirstStruts2/hello?name=Struts2

<form action="hello" method="post">
name:<input type="text" name="name"/><input type="submit" value="Submit"/>  name要接受的get 首先自动set 取
</form>


Action设置数据 

基本属性驱动 基本数据类型 

public class User {


private String userName;
private String password;

}


package com.java.action;




import com.1234.model.User;
import com.1234.service.UserService;
import com.opensymphony.xwork2.ActionSupport;


public class UserAction extends ActionSupport{


/**

*/
private static final long serialVersionUID = 1L;

private UserService userService=new UserService();

private String userName;
private String 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;
}






@Override
public String execute() throws Exception {
System.out.println("执行了UserAction的默认方法");
User user=new User();
user.setUserName(userName);
user.setPassword(password);
if(userService.login(user)){
return SUCCESS;
}else{
return ERROR;
}
}


}

package com.java.service;


import com.java.model.User;


public class UserService {


public boolean login(User user){
if("1234".equals(user.getUserName())&&"123456".equals(user.getPassword())){
return true;
}else{
return false;
}
}
}


<form action="user" method="post">
用户名:<input type="text" name="userName"/>
密码:<input type="text" name="password"/>
<input type="submit" value="登录"/>
</form>




<?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.java1234.action.HelloWorldAction2">
  <result name="success">helloWorld.jsp</result>
  </action>
 
  <action name="user" class="com.java1234.action.UserAction">
  <result name="success">success.jsp</result>
  <result name="error">error.jsp</result>
  </action>
 
  <action name="user2" class="com.java1234.action.UserAction2">
  <result name="success">success.jsp</result>
  <result name="error">error.jsp</result>
  </action>
 
  <action name="user3" class="com.java1234.action.UserAction3">
  <result name="success">success.jsp</result>
  <result name="error">error.jsp</result>
  </action>


  </package>


</struts>


59个属性

javaBean属性注入

private User user;



public User getUser() {
return user;
}


public void setUser(User user) {
this.user = user;
}


@Override
public String execute() throws Exception {
System.out.println("执行了UserAction的默认方法");
if(userService.login(user)){ 不需要再往属性中设值
return SUCCESS;
}else{
return ERROR;
}
}


<form action="user2" method="post">
用户名:<input type="text" name="user.userName"/> 要加上对象自动赋值 自动处理
密码:<input type="text" name="user.password"/>
<input type="submit" value="登录"/>
</form>


一个action中有许多的javaBean

模型驱动

package com.java1234.action;




import com.java1234.model.User;
import com.java1234.service.UserService;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;


public class UserAction3 extends ActionSupport implements ModelDriven<User>{ 传入User


/**

*/
private static final long serialVersionUID = 1L;

private UserService userService=new UserService();

private User user=new User();

@Override
public String execute() throws Exception {
System.out.println("执行了UserAction3的默认方法");
if(userService.login(user)){
return SUCCESS;
}else{
return ERROR;
}
}


@Override
public User getModel() {
// TODO Auto-generated method stub
return user; 返回user 不需要写get set 方法
}


}

<form action="user3" method="post">
用户名:<input type="text" name="userName"/>
密码:<input type="text" name="password"/>
<input type="submit" value="登录"/>
</form>


传入多个值

<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>

import com.opensymphony.xwork2.Action;


public class HobbyAction implements Action{


private String[] hobby; name属性




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;
}


}


<action name="hobby" class="com.java1234.action.HobbyAction">
  <result name="success">success.jsp</result>
  </action>


前后台配置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="foreground" namespace="/fore" extends="struts-default"> http://localhost;8080/HeadFirstStruts/fore/studentList
  <action name="studentList" class="com.java1234.action.ForeStudent">
  <result name="success">${pageContext.request.contextPath}/success.jsp</result> 找根目录下的路径
  </action>
  
  </package>
  
  <package name="background" namespace="/back" extends="struts-default">
  <action name="studentList" class="com.java1234.action.BackStudent" method="show">  调用方法就执行show方法  默认处理execute 
  <result name="success">${pageContext.request.contextPath}/success.jsp</result>
  </action>
  
  </package>
  
  <package name="infoFilter" abstract="true"></package>


</struts>


package com.java1234.action;


import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;


public class BackStudent extends ActionSupport{


@Override
public String execute() throws Exception {
System.out.println("执行了BackStudent Action的默认方法");
return SUCCESS;
}

public String show()throws Exception{
System.out.println("执行了 BackStudent show方法");
return SUCCESS;
}


}


分模块管理

<?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>

  <include file="cheliang.xml"></include> 车辆大模块下面的小模块
  <include file="zichan.xml"></include>


</struts>


<?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.java1234.action.CheLiangAction">
  <result name="success">${pageContext.request.contextPath}/success.jsp</result>
  </action>
  
  </package>


</struts>


通配符动态调用

<?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.enable.DynamicMethodInvocation" value="true" />
  
  <package name="manage" namespace="/" extends="struts-default">
 
  <!-- <action name="student_*" class="com.java1234.action.StudentAction" method="{1}"> //student_list调用list方法 取第一个通配符
  <result name="success">success.jsp</result>
  </action>
 
  <action name="grade_*" class="com.java1234.action.GradeAction" method="{1}">
  <result name="success">success.jsp</result>
  </action> -->
 
 
 
 
  
  </package>


</struts>


package com.java1234.action;


import com.opensymphony.xwork2.ActionSupport;


public class StudentAction extends ActionSupport{


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;
}



}


<h1>通配符</h1>
<a href="Student_list" target="_blank">学生信息查询</a>&nbsp; action中的list方法  StudentAction中的list方法
<a href="Student_add" target="_blank">学生信息添加</a>&nbsp;
<a href="Student_update" target="_blank">学生信息修改</a>&nbsp;
<a href="Student_delete" target="_blank">学生信息删除</a>&nbsp;


动态调用

<!-- <action name="*_*" class="com.java1234.action.{1}Action" method="{2}"> 合并方法
   <result name="success">success.jsp</result>
   </action> -->

<action name="student" class="com.java1234.action.StudentAction">
   <result name="success">success.jsp</result>
   </action>
  
   <action name="grade" class="com.java1234.action.GradeAction">
   <result name="success">success.jsp</result>
   </action>


<h1>动态方法调用</h1>
<a href="student!list" target="_blank">学生信息查询</a>&nbsp;  用action中的名字name
<a href="student!add" target="_blank">学生信息添加</a>&nbsp;
<a href="student!update" target="_blank">学生信息修改</a>&nbsp;
<a href="student!delete" target="_blank">学生信息删除</a>&nbsp;
<br/><br/>
<a href="grade!list" target="_blank">班级信息查询</a>&nbsp;
<a href="grade!add" target="_blank">班级信息添加</a>&nbsp;
<a href="grade!update" target="_blank">班级信息修改</a>&nbsp;
<a href="grade!delete" target="_blank">班级信息删除</a>&nbsp;<br/>


result配置

<?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.enable.DynamicMethodInvocation" value="true" />
  
  <package name="manage" namespace="/" extends="struts-default">
  <global-results>
  <result name="error">error.jsp</result>
  </global-results>
 
  <action name="hello" class="com.java1234.action.HelloAction">
  <result name="success" type="dispatcher">success.jsp</result>
  <result name="r" type="redirect">success.jsp</result>
  <result name="c" type="chain">hello2</result>  数据可以共享 对应下面的action中的name
  <result name="ra" type="redirectAction">hello2</result>重定向到action上 数据待不过去
  </action> 
 
  <action name="hello2" class="com.java1234.action.HelloAction2">
  <result name="success" type="dispatcher">success.jsp</result>
  </action>
  </package>

<body>
<a href="hello?name=Struts2" target="_blank">默认转发_dispatcher</a><br/> 能够取到值 result name=“success”
<a href="hello!r?name=Struts2" target="_blank">重定向_redirect</a><br/> 取不到值 name="r"
<a href="hello!c?name=Struts2" target="_blank">链条_chain</a><br/> 
<a href="hello!ra?name=Struts2" target="_blank">重定向到Action_redirectAction</a><br/>


<a href="hello" target="_blank">全局result配置</a><br/> 不带参数就去找全局变量
</body>

</struts>


package com.java1234.action;


import com.opensymphony.xwork2.ActionSupport;


public class HelloAction extends ActionSupport{


/**

*/
private static final long serialVersionUID = 1L;

private String name;
private String error;




public String getName() {
return name;
}


public void setName(String name) {
this.name = name;
}





public String getError() {
return error;
}


public void setError(String error) {
this.error = error;
}


@Override
public String execute() throws Exception {
if(name==null || "".equals(name)){
this.error="name是空";
return ERROR;
}
return SUCCESS;
}


public String r()throws Exception{ r方法写在action中
return "r";
}

public String c()throws Exception{
return "c";
}


public String ra()throws Exception{
return "ra";
}



}


全局result

<global-results>
  <result name="error">error.jsp</result>
  </global-results>


  <body>
错误信息:${error }
</body>


@Override
public String execute() throws Exception {  name=“hello” 在action中找没有找到error的result取global中去找
if(name==null || "".equals(name)){
this.error="name是空";
return ERROR;
}
return SUCCESS;
}


struts拦截器

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 name="manage" namespace="/" extends="struts-default">
 
  <interceptors> 定义拦截器
  <interceptor name="myInterceptor" class="com.java1234.interceptor.MyInterceptor"></interceptor>
  </interceptors>
 
  <action name="hello" class="com.java1234.action.HelloAction">
  <result name="success">success.jsp</result>
 
  <interceptor-ref name="myInterceptor"></interceptor-ref> 引用拦截器 最外层先进入
  <interceptor-ref name="defaultStack"></interceptor-ref>
  </action>
  </package>


</struts>



package com.java1234.interceptor;


import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;


public class MyInterceptor implements Interceptor{ 自定义拦截器


@Override
public void destroy() { 销毁的时候调用
// TODO Auto-generated method stub
System.out.println("MyInterceptor销毁");
}


@Override 
public void init() { 初始化的时候调用
// TODO Auto-generated method stub
System.out.println("MyInterceptor初始化");
}


@Override
public String intercept(ActionInvocation invocation) throws Exception { 拦截器
System.out.println("在Action执行之前");
String result=invocation.invoke(); 调用拦截器内存 返回值 执行到底层的defaultStack
System.out.println("result:"+result);
System.out.println("在Action执行之后");
return result;
}


}



登录拦截验证器

public class UserService {


public boolean login(User user){
if("java1234".equals(user.getUserName())&&"123456".equals(user.getPassword())){
return true;
}else{
return false;
}
}
}


@Override
public String execute() throws Exception {
if(userService.login(user)){ 返回值boolean类型
ActionContext actionContext=ActionContext.getContext(); 构造对象来获取session二次封装的
Map<String, Object> session=actionContext.getSession();
session.put("currentUser", user); 放user对象放到session中存的是值栈
return SUCCESS;
}else{
this.error="用户名或密码错误";
return "error";
}
}



<?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="manage" namespace="/" extends="struts-default">
 
  <interceptors>
  <interceptor name="myInterceptor" class="com.java1234.interceptor.MyInterceptor"></interceptor>
  <interceptor name="loginInterceptor" class="com.java1234.interceptor.LoginInterceptor"></interceptor>
 
  <interceptor-stack name="myStack"> 定义拦截器栈一个动作
  <interceptor-ref name="loginInterceptor"></interceptor-ref>
  <interceptor-ref name="defaultStack"></interceptor-ref> package中extends的
  </interceptor-stack>
  </interceptors>
 
  <default-interceptor-ref name="myStack"></default-interceptor-ref> package默认的使用myStack
 
  <global-results> action中没找到去全局中找
  <result name="error">error.jsp</result> 重复的抽取出来 包下的每一个action都是用myStack拦截器
  </global-results>
 

 
  <interceptor-ref name="myInterceptor"></interceptor-ref>
  <interceptor-ref name="defaultStack"></interceptor-ref>
  </action>
 
  <action name="user" class="com.java1234.action.UserAction">
  <result name="success">success.jsp</result>
 
  <interceptor-ref name="defaultStack"></interceptor-ref> user不能删除永远登录不进去永远被拦截了
  </action>
 
  <action name="gril" class="com.java1234.action.GrilAction">
  <result name="success">success.jsp</result>
  <!-- <interceptor-ref name="loginInterceptor"></interceptor-ref>  没有登录不能看美
  <interceptor-ref name="defaultStack"></interceptor-ref> --> 不需要写了 有默认拦截器
  </action>
  </package>


</struts>


package com.java1234.interceptor;


import java.util.Map;


import javax.servlet.http.HttpServletRequest;


import org.apache.struts2.ServletActionContext;


import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;


public class LoginInterceptor implements Interceptor{


@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("LoginInterceptor销毁");
}


@Override
public void init() {
// TODO Auto-generated method stub
System.out.println("LoginInterceptor初始化");
}


@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("在Action执行之前");
ActionContext actionContext=invocation.getInvocationContext();
Map<String, Object> session=actionContext.getSession();
Object currentUser=session.get("currentUser"); get是Action中存在session中的key
String result=null;
if(currentUser!=null){
result=invocation.invoke();继续调用后面的
}else{ 跳到错误页面
HttpServletRequest request=(HttpServletRequest)invocation.getInvocationContext().get(ServletActionContext.HTTP_REQUEST); 获取request
request.setAttribute("error", "请先登录!");
result="error";
}
System.out.println("result:"+result);
System.out.println("在Action执行之后");
return result;
}


}


404报错 项目 properties web project Settings

servers  remove Add 启动


Struts标签

比JSTL强大 性能速度降低

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

Struts2 数据标签

 

Property 标签:输出 OGNL 表达式的值;

 

Set 标签:设置变量;

 

Bean 标签:定义 javaBean 对象;

 

Date 标签:日期标签;

 

Debug 标签:调试标签;

 

Url&a 标签:超链接标签;

 

Include 标签:动态包含标签;


<h>数据标签</h>
<hr/>
<a href="data/property.jsp" target="_blank">property标签</a><br/>
<a href="data/set.jsp" target="_blank">set标签</a><br/>
<a href="data/bean.jsp" target="_blank">bean标签</a><br/>
<a href="data/date.jsp" target="_blank">date标签</a><br/>
<a href="data/debug.jsp" target="_blank">debug标签</a><br/>
<a href="data/url_a.jsp" target="_blank">url_a标签</a><br/>
<a href="data/include.jsp" target="_blank">include标签</a><br/>
</body>

<%
request.setAttribute("name","<font color=red>张三</font>");request中定义name
%>
</head>
<body>
<s:property value="#request.name" /><br/>  OGNL
<s:property value="#request.name2" default="某某人"/><br/>
<s:property value="#request.name" default="某某人" escapeHtml="false"/><br/>  执行html
</body>

set标签

<body>
<s:set var="i" value="1"></s:set>i=1
<s:property value="#i" /><br/>
<s:set var="a"  value="'action范围的值'" scope="action"></s:set>
<s:set var="p"  value="'page范围的值'" scope="page"></s:set>
<s:set var="r"  value="'request范围的值'" scope="request"></s:set>
<s:set var="s"  value="'session范围的值'" scope="session"></s:set>
<s:set var="app"  value="'application范围的值'" scope="application"></s:set>
<s:property value="#a" /><br/> action范围直接取值栈
<s:property value="#attr.p"/><br/> page范围
<s:property value="#request.r"/><br/>
<s:property value="#session.s"/><br/>
<s:property value="#application.app"/><br/>
</body>

bean标签

<body>
<s:bean name="com.java1234.model.Student" var="student"> name类 var对象
<s:param name="name" value="'张三'"></s:param> 构造赋值
<s:param name="age" value="10"></s:param>
</s:bean> 
<s:property value="#student.name"/>
<s:property value="#student.age"/>
</body>


date标签

<%
request.setAttribute("date",new Date());
%>
</head>
<body>
${date }<br/> 直接输出日期
当前日期:<s:date name="#request.date" format="yyyy-MM-dd"/>
</body>


超链接标签

<body>
<s:url action="hello" namespace="/foreground" id="h"> h变量
<s:param name="name" value="'struts2'"></s:param> name后面参数?struts2

</s:url>
<s:a href="%{h}">超链接</s:a>


<s:a action="hello" namespace="/foreground">
<s:param name="name" value="'struts2'"></s:param>
超链接2
</s:a> 直接是一个超链接
</body>


<body> 动态包含
<s:include value="head.html"></s:include>
</body>

Struts2 控制标签

 

Ifelse 标签:条件判断标签;

 

Iterator 标签:遍历标签;

 

Append 标签:叠加标签;

 

Generator 标签:分隔标签;

 

Merge 标签:组合标签;

 

Sort 标签:排序标签;

 

Subset 标签:截取标签;

<%
int age=11;
request.setAttribute("age",age);
%>
</head>
<body>
<s:if test="#request.age<20">
年龄小于20岁
</s:if>
<s:elseif test="#request.age==20">
年龄等于20岁
</s:elseif>
<s:else>  JSTL 只有if 没有else
年龄大于20岁
</s:else>
</body>


<%@ page import="com.java1234.model.Student" %>
<%@ page import="java.util.*" %>

<%
List<Student> studentList=new ArrayList<Student>();
studentList.add(new Student(1,"张三",10));
studentList.add(new Student(3,"李四",20));
studentList.add(new Student(5,"王五",30)); 三个javaBean对象
request.setAttribute("studentList",studentList);list设置到request对象中
%>
</head>
<body>
<table>
<tr>
<th>序号</th>
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
</tr>
<s:iterator value="#request.studentList" status="status">
<tr>
<td><s:property value="#status.index+1"/></td>
<td><s:property value="id"/></td>不需要取对象直接去对象的属性
<td><s:property value="name"/></td>
<td><s:property value="age"/></td>
</tr>
</s:iterator>
</table>
</body>


append标签

<%
List<Student> studentList1=new ArrayList<Student>();
List<Student> studentList2=new ArrayList<Student>();
studentList1.add(new Student(1,"张三",10));
studentList1.add(new Student(3,"李四",20));
studentList2.add(new Student(5,"王五",30));
studentList2.add(new Student(7,"赵六",40));
request.setAttribute("studentList1",studentList1);
request.setAttribute("studentList2",studentList2);
%>
</head>
<body>
<s:append var="studentList3">
<s:param value="#request.studentList1"></s:param>
<s:param value="#request.studentList2"></s:param>
</s:append>


<s:iterator value="studentList3" status="status"> 按顺序叠加的
<tr>
<td><s:property value="#status.index+1"/></td>
<td><s:property value="id"/></td>
<td><s:property value="name"/></td>
<td><s:property value="age"/></td>
</tr>
</s:iterator>

分割标签

<s:generator separator="," val="'张三,李四,王五'" var="nameList"></s:generator>
<s:iterator value="#nameList">
<s:property/>
</s:iterator>


组合标签 混合

<s:merge var="studentList3">
<s:param value="#request.studentList1"></s:param>
<s:param value="#request.studentList2"></s:param>
</s:merge>


<s:iterator value="studentList3" status="status">
<tr>
<td><s:property value="#status.index+1"/></td>
<td><s:property value="id"/></td>
<td><s:property value="name"/></td>
<td><s:property value="age"/></td>
</tr>
</s:iterator>


排序标签

public class MyComparator implements Comparator<Student>{


public int compare(Student s1, Student s2) {
if(s1.getAge()>s2.getAge()){
return 1;
}else if(s1.getAge()<s2.getAge()){
return -1;
}
return 0;
}


}

<s:bean id="myComparator" name="com.java1234.comparator.MyComparator"></s:bean>

<table>
<tr>
<th>序号</th>
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
</tr>
<s:sort comparator="#myComparator" source="#request.studentList1" >根据年龄升序
<s:iterator status="status">
<tr>
<td><s:property value="#status.index+1"/></td>
<td><s:property value="id"/></td>
<td><s:property value="name"/></td>
<td><s:property value="age"/></td>
</tr>
</s:iterator>
</s:sort>
</table>


截取标签

<s:subset source="#request.studentList1" count="2" start="2"> 截取2条数据 索引从2开始


<body>
<h>界面标签</h>
<hr/>
<a href="ui/form.jsp" target="_blank">form标签</a><br/>
<a href="ui/text.jsp" target="_blank">文本标签</a><br/>
<a href="ui/radio.jsp" target="_blank">单选标签</a><br/>
<a href="ui/checkbox.jsp" target="_blank">复选框标签</a><br/>
<a href="ui/select.jsp" target="_blank">下拉框标签</a><br/>
<a href="ui/sort.jsp" target="_blank">sort标签</a><br/>
<a href="ui/subset.jsp" target="_blank">subset标签</a><br/>
</body>


<s:form action="hello" method="post" namespace="/foreground">  提交表单的 普通标签加载前面命名空间
</s:form>


<body>
用户名:<s:textfield name="userName"></s:textfield><br/>
密码:<s:password name="password"></s:password><br/>
备注:<s:textarea name="desc"></s:textarea><br/>
</body>


<body>
性别:<s:radio list="#{0: '男 ', 1:'女 '}" name="sex" value="0" />  单选
</body>


<body>
爱好:<s:checkboxlist list="#{0: '游泳', 1:'唱歌 ',2:'跳舞'}" name="hobby" value="1" /> 
</body>


<body>  下拉框
爱好:<s:select list="#{0: '游泳', 1:'唱歌 ',2:'跳舞'}" name="hobby" value="1" multiple="true"/> 
</body>


<body>
<h>其他标签</h>
<hr/>
<a href="other/updownselect.jsp" target="_blank">updownselect标签</a><br/>
<a href="other/optiontransferselect.jsp" target="_blank">optiontransferselect标签</a><br/>
</body>


<s:optiontransferselect label="选择你喜欢图书"  
              name="cnbook" leftTitle="中文图书"  list="{'struts2权威指南','轻量级javaeye 企业应用空实战','ajax讲义'}"
              doubleName="enBook"  rightTitle="外文图书" doubleList="{'JavaScrip:The definitive Guide','export one-to-one'}"  multiple="true" 
              addToLeftLabel="向左移动" addToRightLabel="向右移动" addAllToRightLabel="全部右移" addAllToLeftLabel="全部左移"
               allowSelectAll="true" headerKey="cnKey" headerValue="选择图书" emptyOption="true"   doubleHeaderKey="enKey" 
               doubleHeaderValue="选择外文图书" doubleMultiple="true" doubleEmptyOption="true"  leftDownLabel="向下移动" 
       rightDownLabel="向下移动" 
       leftUpLabel="向上移动" 
       rightUpLabel="向上移动" >
   </s:optiontransferselect>


struts2国际化

<?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.custom.i18n.resources" value="java1234"></constant> value国际化资源的文件
 
</struts>

userName=\u7528\u6237\u540d
password=\u5bc6\u7801
login=\u767b\u5f55
welcomeInfo=\u6b22\u8fce{0}


java1234_zh_CN.properties


java1234_en_US.properties


userName=userName
password=password
login=login
welcomeInfo=welcome{0}


<table>
<tr>
<td><s:text name="userName"></s:text></td> 访问国际化资源标签 name是配置文件中的key
<td>
<input type="text"/>
</td>
</tr>
<tr>
<td><s:text name="password"></s:text></td>
<td>
<input type="text"/>
</td>
</tr>
<tr>
<td>
<input type="button" value="<s:text name='login'></s:text>"/> 
</td>
</tr>
</table>


<s:text name="welcomeInfo">
<s:param>Jack</s:param>
</s:text>


struts验证框架

public class User {


private String userName;
private String name;
private int age;
private String email;
private String homePage; 主页


public class RegisterAction extends ActionSupport{


/**

*/
private static final long serialVersionUID = 1L;

private User user;


public User getUser() {
return user;
}


public void setUser(User user) {
this.user = user;
}


@Override
public String execute() throws Exception {
System.out.println("传入的用户:"+user);
return SUCCESS;
}


RegisterAction-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>
    <field name="user.name">
    <field-validator type="requiredstring">
            <message>请输入姓名</message>
        </field-validator>
    </field>
    <field name="user.age">
    <field-validator type="int">
    <param name="min">18</param>
            <message>年龄必须满18周岁</message>
        </field-validator>
    </field>
    <field name="user.email">
    <field-validator type="requiredstring">
            <message>请输入邮件</message>
        </field-validator>
        <field-validator type="email">
            <message>邮件格式不对</message>
        </field-validator>
    </field>
    <field name="user.homePage">
    <field-validator type="requiredstring">
            <message>请输入主页</message>
        </field-validator>
        <field-validator type="url">
            <message>主页格式不对</message>
        </field-validator>
    </field>
    
    
    <validator type="expression">
    <param name="expression"><![CDATA[!user.name.equals(user.userName)]]></param>
    <message>用户名和真实姓名不能相同</message>
    </validator>
</validators>


<?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="manager" extends="struts-default">

<action name="registerAction" class="com.java1234.action.RegisterAction">
<result name="input">/register.jsp</result> 验证失败内部返回input 返回原来的地方拦截
<result name="success">/success.jsp</result>
</action>

</package>
 
</struts>


<body>
<s:actionerror/>
用户注册
<s:form action="/registerAction" method="post"> struts中action的name /
<s:textfield name="user.userName" label="用户名"></s:textfield>
<s:textfield name="user.name" label="真实姓名"></s:textfield>
<s:textfield name="user.age" label="年龄"></s:textfield>
<s:textfield name="user.email" label="邮件"></s:textfield>
<s:textfield name="user.homePage" label="主页"></s:textfield>
<s:submit value="注册"></s:submit>
</s:form>
</body>


自定义验证

<validator name="sensitive" class="com.java1234.validators.SensitiveWordValidators"/> 敏感词汇验证


package com.java1234.validators;


import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;


public class SensitiveWordValidators extends FieldValidatorSupport{


@Override
public void validate(Object object) throws ValidationException {
String fieldName=this.getFieldName(); 用户输入的系统字段 返回页面
String value=this.getFieldValue(fieldName, object).toString(); 获取用户输入的值
if(!check(value)){ 返回false
this.addFieldError(fieldName, object);
}
}

public boolean check(String value){
String sensitiveWords[]={"c","nm"};
for(int i=0;i<sensitiveWords.length;i++){
if(value.indexOf(sensitiveWords[i])>-1){ 已经存在
return false;
}
}
return true;
}


}


public class ValidationAction extends ActionSupport{


/**

*/
private static final long serialVersionUID = 1L;

private String name;


public String getName() {
return name;
}


public void setName(String name) {
this.name = name;
}


@Override
public String execute() throws Exception {
System.out.println("姓名:"+name);
return SUCCESS;
}

}


ValidationAction-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="name">
        <field-validator type="requiredstring">
            <message>请输入姓名</message>
        </field-validator>
        
        <field-validator type="sensitive"> 自定义拦截器 validators.xml中的name
            <message>有敏感词汇</message>
        </field-validator>
    </field>
    
</validators>


简单自定义验证
<s:form action="/validationAction" method="post">
<s:textfield name="name" label="姓名"></s:textfield>
<s:submit value="提交"></s:submit>
</s:form>


struts2文件上传与下载

<body>
<s:fielderror></s:fielderror>
<form action="upload" method="post" enctype="multipart/form-data"> 文件上传以二进制的形式传
文件:<input type="file" name="java1234"/><br/> name一样后面接手的也是name中的值
<input type="submit" value="提交"/>
</form>
</body>


package com.java1234.action;


import java.io.File;


import org.apache.commons.io.FileUtils;


import com.opensymphony.xwork2.ActionSupport;


public class FileUploadAction extends ActionSupport{


/**

*/
private static final long serialVersionUID = 1L;

private File java1234; // 文件 input中的name

private String java1234FileName;  // 文件名

private String java1234ContentType;  // 文件类型


public File getJava1234() {
return java1234;
}


public void setJava1234(File java1234) {
this.java1234 = java1234;
}


public String getJava1234FileName() {
return java1234FileName;
}


public void setJava1234FileName(String java1234FileName) {
this.java1234FileName = java1234FileName;
}


public String getJava1234ContentType() {
return java1234ContentType;
}


public void setJava1234ContentType(String java1234ContentType) {
this.java1234ContentType = java1234ContentType;
}


@Override
public String execute() throws Exception {
System.out.println("文件名:"+java1234FileName);
System.out.println("文件类型:"+java1234ContentType);
String filePath="C:/"+java1234FileName; 上传到本地c磁盘
File saveFile=new File(filePath); 定义一个文件
FileUtils.copyFile(java1234, saveFile); 第一个是srcFile 另一个是目标的file
return SUCCESS;
}
}


<?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">

<action name="upload" class="com.java1234.action.FileUploadAction"> form中的action
<result name="success">/success.jsp</result>
<result name="input">/fileupload.jsp</result>

<!-- <interceptor-ref name="fileUpload"> name中的系统拦截器
<param name="allowedTypes">image/bmp,image/x-png,image/gif,image/jpg,image/jpeg</param>
<param name="maximumSize">81101</param>
</interceptor-ref>

<interceptor-ref name="defaultStack"></interceptor-ref> -->
</action>

</package>
 
</struts>


多文件上传

<s:fielderror></s:fielderror>
<form action="uploads" method="post" enctype="multipart/form-data">
文件1:<input type="file" name="java1234"/><br/>
文件2:<input type="file" name="java1234"/><br/>
文件3:<input type="file" name="java1234"/><br/>
<input type="submit" value="提交"/>
</form>



public class FilesUploadAction extends ActionSupport{


/**

*/
private static final long serialVersionUID = 1L;

private File[] java1234; // 文件 根据input的name

private String[] java1234FileName;  // 文件名

private String[] java1234ContentType;  // 文件类型


public File[] getJava1234() {
return java1234;
}


public void setJava1234(File[] java1234) {
this.java1234 = java1234;
}


public String[] getJava1234FileName() {
return java1234FileName;
}


public void setJava1234FileName(String[] java1234FileName) {
this.java1234FileName = java1234FileName;
}



public String[] getJava1234ContentType() {
return java1234ContentType;
}


public void setJava1234ContentType(String[] java1234ContentType) {
this.java1234ContentType = java1234ContentType;
}


@Override
public String execute() throws Exception {
for(int i=0;i<java1234.length;i++){
System.out.println("文件名:"+java1234FileName[i]);
System.out.println("文件类型:"+java1234ContentType[i]);
String filePath="C:/"+java1234FileName[i];
File saveFile=new File(filePath);
FileUtils.copyFile(java1234[i], saveFile);
}
return SUCCESS;
}

}

文件下载

package com.java1234.action;


import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;


import com.opensymphony.xwork2.ActionSupport;


public class FileDownloadAction extends ActionSupport{


/**

*/
private static final long serialVersionUID = 1L;

private String fileName;


public String getFileName() throws Exception{
fileName=new String(fileName.getBytes(),"ISO8859-1"); 乱码文件
return fileName;
}


public void setFileName(String fileName) {
this.fileName = fileName;
}

public InputStream getInputStream()throws Exception{ 方法必须是这个方法
File file=new File("C:/美女1.jpg");
this.fileName="美女1号";
return new FileInputStream(file);
}


}

<action name="download" class="com.java1234.action.FileDownloadAction">
<result type="stream"> 返回的是一个流
<param name="contentDisposition">attachment;filename=${fileName}</param> 配置信息 调用get方法
</result>
</action>


放重复提交

<body>
<s:actionerror/> 显示错误信息
<form action="student" method="post" >
<s:token></s:token> 令牌 
姓名:<input type="text" name="student.name"/><br/>
年龄:<input type="text" name="student.age"/><br/>
<input type="submit" value="提交"/>
</form>
</body>


<?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="manager" extends="struts-default">
<action name="student" class="com.java1234.action.StudentAction" method="add">
<result name="success">/success.jsp</result>
<!-- <result name="invalid.token">/student.jsp</result> 重复提交回到页面
<interceptor-ref name="token"></interceptor-ref> 识别令牌
<interceptor-ref name="defaultStack"></interceptor-ref> -->多了一层
<interceptor-ref name="tokenSession"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>

</package>
 
</struts>



原创粉丝点击