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> action中的list方法 StudentAction中的list方法
<a href="Student_add" target="_blank">学生信息添加</a>
<a href="Student_update" target="_blank">学生信息修改</a>
<a href="Student_delete" target="_blank">学生信息删除</a>
动态调用
<!-- <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> 用action中的名字name
<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/>
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>
- struts2基础
- Struts2基础
- struts2基础
- struts2基础
- Struts2 基础
- struts2基础
- struts2基础
- Struts2基础
- Struts2基础
- Struts2基础
- struts2--基础
- Struts2基础
- struts2基础
- Struts2基础
- Struts2基础
- Struts2基础
- Struts2 基础
- Struts2基础
- Jmeter逻辑控制器学习
- 现代操作系统的调度
- Jmeter逻辑控制器学习(续)
- 什么是MIME Type
- 韩顺平2017年最新php视频,泰牛php程序员大牛班,基础班视频教程
- Struts2基础
- Python--日志模块Logging
- dubbo生产者中的配置
- dubbo中消费者配置文件
- Spring 4.0 学习日记(4)--- bean的作用域
- Python--paramiko模块
- ubuntu 安装ORACLE JDK失败后导致的系统错误及UPDATE错误的解决办法
- Rosalind-查找motif位置
- GitHub