21.struts-Action配置.md
目录
1.Action开发方式
- 继承ActionSupport-struts的数据过滤等方法封装在其中,开发中用此方法
- 实现Action
- 既不实现也不实现
Action类中定义了一些常量,例如常用返回的标签success,有对应的常量SUCCESS
2.通配符
当有两个Action中的方法,返回了同一个标签,那么在struts.xml配置中,不需要多次配置,可以用通配符。
package per.liyue.code.struts2demo;
import com.opensymphony.xwork2.ActionSupport;
public class HelloStruts2 extends ActionSupport{
//定义了一个常量或者对象和前台交互时候使用
private String userName;
//必须提供get和set方法,否则struts不会自动填充
public String getUseName() {
return userName;
}
public void setUseName(String useName) {
this.userName = useName;
}
@Override
public String execute() throws Exception {
System.out.println("进入了Action开始处理代码! 用户:" + userName);
return "success";
}
public String login(){
System.out.println("进入了Action的login中处理! 用户:" + userName);
return SUCCESS;
}
public String register(){
System.out.println("进入了Action的register中处理! 用户:" + userName);
return SUCCESS;
}
}
此时,用*来表示通配地址
·```xml
/success.jsp
/success.jsp
-->
<!-- 使用通配符实现 -->
<action name="user_*" class="per.liyue.code.struts2demo.HelloStruts2" method="{1}">
<result name="success">/success.jsp</result>
</action>
</package>
此时在浏览器中的访问地址由:
>http://localhost.:8080/StrutsDemo1/register
变为:
>http://localhost.:8080/StrutsDemo1/user_register
或者
http://localhost.:8080/StrutsDemo1/user_login
此外还可以再进一步,将*和{1}搭配使用,下面的修改将action中的返回标签和配置文件中的对应标签全部用通配符处理:
```java
package per.liyue.code.struts2demo;
import com.opensymphony.xwork2.ActionSupport;
public class HelloStruts2 extends ActionSupport{
//定义了一个常量或者对象和前台交互时候使用
private String userName;
//必须提供get和set方法,否则struts不会自动填充
public String getUseName() {
return userName;
}
public void setUseName(String useName) {
this.userName = useName;
}
public String login(){
System.out.println("进入了Action的login中处理! 用户:" + userName);
return "login";
}
public String register(){
System.out.println("进入了Action的register中处理! 用户:" + userName);
return "register";
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="config_HelloStruts2" extends="struts-default" >
<!-- 同一个标签用类似的重复代码实现
<action name="login" class="per.liyue.code.struts2demo.HelloStruts2" method="login">
<result name="success">/success.jsp</result>
</action>
<action name="register" class="per.liyue.code.struts2demo.HelloStruts2" method="register">
<result name="success">/success.jsp</result>
</action>
-->
<!-- 使用通配符实现 -->
<action name="user_*" class="per.liyue.code.struts2demo.HelloStruts2" method="{1}">
<result name="{1}">/success.jsp</result>
</action>
</package>
</struts>
``
此时浏览器地址为:
>http://localhost.:8080/StrutsDemo1/user_login
# 访问地址
如果定义了命名空间地址:
```xml
<package name="config_HelloStruts2" namespace="/new" extends="struts-default" >
那么访问地址为:
http://localhost.:8080/StrutsDemo1/new/user_login
访问地址的情况:
路径格式 | 是否可访问 | 备注 |
---|---|---|
http://localhost.:8080/StrutsDemo1/new/user_login | 可以 | 标准访问 |
http://localhost.:8080/StrutsDemo1/new/a/user_login | 可以 | struts会一层层解析,在/new这层可以得到结果并返回 |
http://localhost.:8080/StrutsDemo1/a/new/user_login | 不可以 | 无法解析出可用的action地址 |
目录
3.常量
后缀
- 在struts中的默认后缀是.do
- 在struts2中默认的后缀是.action
如果需要修改,在
/org/apache/struts2/default.properties
文件中,先找到
struts.action.extension=action,,
然后在项目总配置文件中修改
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 全局配置后缀 -->
<!-- struts2中拷贝的源代码:struts.action.extension=action,,
然后key和value的匹配则可以修改
-->
<!--这个修改还是沿用默认的修改
<constant name="struts.action.extension" value="action,,"></constant>
-->
<!-- 这个修改支持action和do后缀,并且不允许空
<constant name="struts.action.extension" value="action,do,"></constant>
-->
<!-- 这个修改支持action和do后缀,并且允许空
<constant name="struts.action.extension" value="action,do,,"></constant>
-->
<!-- 在总配置文件中引入其他配置文件 -->
<include file="per/liyue/code/struts2demo/config_HelloStruts2.xml"></include>
</struts>
指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法和freemarker 、velocity的输出
<constant name="struts.i18n.encoding" value="UTF-8"/>
自定义后缀修改常量
<constant name="struts.action.extension" value="do"/>
设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭
<constant name="struts.serve.static.browserCache" value="false"/>
当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开
<constant name="struts.configuration.xml.reload" value="true"/>
开发模式下使用,这样可以打印出更详细的错误信息
<constant name="struts.devMode" value="true" />
默认的视图主题
<constant name="struts.ui.theme" value="simple" />
与spring集成时,指定由spring负责action对象的创建
<constant name="struts.objectFactory" value="spring" />
该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性
为 false
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
上传文件的大小限制
<constant name="struts.multipart.maxSize" value=“10701096"/>
4.数据处理
获取Servlet的api
继承ActionSupport类
实现接口RequestAware、SessionAware、ApplicationAware
- 先实现Action类:
package per.liyue.code.struts2_data;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class DataAction extends ActionSupport{
@Override
public String execute() throws Exception {
/*
* struts2中对数据的操作方式1:
* 获取到servlet api
*/
//获取
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
ServletContext servletContext = ServletActionContext.getServletContext();
//传入
request.setAttribute("api_request_data", "request_api");
session.setAttribute("api_session_data", "session_api");
servletContext.setAttribute("api_servletContext_data", "servletContext_api");
/*
* struts2中对数据的操作方式2:
* struts2将相应的对象封装到了Map
*/
//获取对象
ActionContext context = ActionContext.getContext();
//获取request的map
Map<String, Object> contextMap = context.getContextMap();
//获取session的map
Map<String, Object> session_Map = context.getSession();
//获取ServletContext的map
Map<String, Object> application = context.getApplication();
//传入
contextMap.put("map_request_data", "request_map");
session_Map.put("map_session_data", "session_map");
application.put("map_servletContext_data", "servletContext_map");
return SUCCESS;
}
}
- Action类的配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="data" namespace="/" extends="struts-default">
<!-- 全局配置 -->
<global-results>
<result name="success">/data.jsp</result>
</global-results>
<action name="data" class="per.liyue.code.struts2_data.DataAction"></action>
<action name="data_implements" class="per.liyue.code.struts2_data.DataAction_implement">
<result name="success">/data_implements.jsp</result>
</action>
</package>
</struts>
- 前端的jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
${api_request_data} <br/>
${api_session_data} <br/>
${api_servletContext_data} <br/>
${map_request_data} <br/>
${map_session_data} <br/>
${map_servletContext_data} <br/>
</body>
</html>
- 总配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 全局配置后缀 -->
<!-- struts2中拷贝的源代码:struts.action.extension=action,,
然后key和value的匹配则可以修改
-->
<!--这个修改还是沿用默认的修改
<constant name="struts.action.extension" value="action,,"></constant>
-->
<!-- 这个修改支持action和do后缀,并且不允许空
<constant name="struts.action.extension" value="action,do,"></constant>
-->
<!-- 这个修改支持action和do后缀,并且允许空
<constant name="struts.action.extension" value="action,do,,"></constant>
-->
<!-- 在总配置文件中引入其他配置文件 -->
<include file="per/liyue/code/struts2demo/config_HelloStruts2.xml"></include>
<include file="per/liyue/code/struts2_data/data.xml"></include>
</struts>
对于接口实现的方式:
- Action类
package per.liyue.code.struts2_data;
import java.util.Map;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class DataAction_implement extends ActionSupport
implements RequestAware, SessionAware, ApplicationAware {
private Map<String, Object> request_implements;
private Map<String, Object> session_implements;
private Map<String, Object> servletContext_implements;
/*
* 接口方式实现
*/
// struts运行时候,会把代表request的map对象注入
@Override
public void setRequest(Map<String, Object> request) {
this.request_implements = request;
}
//session注入
@Override
public void setSession(Map<String, Object> session) {
this.servletContext_implements = session;
}
//application注入
@Override
public void setApplication(Map<String, Object> application) {
this.servletContext_implements = application;
}
@Override
public String execute() throws Exception {
/*
* struts2中对数据的操作方式3: 实现接口RequestAware, SessionAware, ApplicationAware
*/
request_implements.put("implements_request_data", "request_implements");
session_implements.put("implements_session_data", "session_implements");
servletContext_implements.put("implements_request_data", "request_implements");
return SUCCESS;
}
}
- 配置Action文件
xml文件同上
- jsp文件
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
${implements_request_data} <br/>
${implements_session_data} <br/>
${implements_request_data} <br/>
</body>
</html>
- 总配置文件
xml同上
21.struts-Action配置.md的更多相关文章
- struts2视频学习笔记 03-06(Struts 2配置文件无提示问题,Action配置中的各项默认值,各种转发类型)
课时3 解决Struts 2配置文件无提示问题(eclipse):window→preference→XML→XML Catlog
- struts中的常量,action配置中的默认值
1.struts中Action的开发方式 继承ActionSupport类,这种方法实现的Action可以进行数据校验: 实现Action接口: 不继承任何类,不实现任何接口: 是否继承类或实现接口, ...
- struts2 + jquery 开发环境下的ajax构建方法(action写法 + struts.xml配置 + js调用代码)
1.action写法 public class RegisterAction extends ActionSupport { private InputStream inputStream; /** ...
- action spring 注入错误,如果检查各项注入都没有错误时,考虑struts 是否配置了namespace(如果你有多个namespace="/")
[ERROR] 2015-01-04 09:42:35,180 (CommonsLogger.java:38) - Exception occurred during processing reque ...
- Struts 2 配置Action详解_java - JAVA
文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 实现了Action处理类之后,就可以在struts.xml中配置该Action,从而让Struts 2框架知道哪个Act ...
- Action的三种实现方式,struts.xml配置的详细解释及其简单执行过程(二)
勿以恶小而为之,勿以善小而不为--------------------------刘备 劝诸君,多行善事积福报,莫作恶 上一章简单介绍了Struts2的'两个蝴蝶飞,你好' (一),如果没有看过,请观 ...
- struts2.1.6教程二、struts.xml配置及例程
1.配置文件的优先级 在struts2中一些配置(比如常量)可以同时在struts-default.xml(只读性),strtus-plguin.xml(只读性),struts.xml,struts. ...
- Struts2基于注解的Action配置
使用注解来配置Action的最大好处就是可以实现零配置,但是事务都是有利有弊的,使用方便,维护起来就没那么方便了. 要使用注解方式,我们必须添加一个额外包:struts2-convention-plu ...
- struts.xml配置
1. package标签 package:完成有业务相关的Action(应用控制器的)管理 name:给包起的名字(反映该包中Action的功能),用来完成包和包之间的继承.默认继承struts-de ...
随机推荐
- javascript-时间戳
// 获取当前时间戳(以s为单位) var timestamp = Date.parse(new Date()); timestamp = timestamp / 1000; console.log( ...
- 本地IP,掩码,网关,DNS设置
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- bootstrap4学习—Bootstrap v4.0.0-alpha.6的快速参考
下面为Bootstrap v4.0.0-alpha.6中的代码快速检索地址: 网址:https://hackerthemes.com/bootstrap-cheatsheet/ 在使用bootstra ...
- Ren'Py视觉小说安装,玩一下吧,上班很闲的话
---------------------------------------------------------------------------------------------------- ...
- Solr——从postgresql数据库导入数据
1,配置准备 本文的前提是你已经配置好了solr,并新创建了一个core,我们下面都会按照前一篇文章中的core_demo为基础开始 2,修改soreconfig.xml 在soreconfig.xm ...
- uWSGI, Gunicorn, 啥玩意儿?
因为nginx等优秀的开源项目,有不少本来不是做服务器的同学也可以写很多服务器端的程序了.但是在聊天中会发现,大家虽然写了不少代码,但是对wsgi是什么,gunicorn是什么,反向代理又是什么并不了 ...
- flask 简单的语音识别
from aip import AipSpeech,AipNlp #AipNlp 为自然语言处理 """ 你的 APPID AK SK """ ...
- android 开发 实现一个自定义布局的AlertDialog对话框
对话框有很多实现方法,最常见的是在一个点击事件中代码直接写出对话框.如下: package com.example.lenovo.mydemo2; import android.content.Dia ...
- linux 查看磁盘空间
linux 查看磁盘空间大小命令 df :命令是linux系统以磁盘分区为单位查看文件系统,可以加上参数查看磁盘剩余空间信息 df -hl:查看磁盘剩余空间信息,显示如下: 文件系统 ...
- layui动态options
layui 坑 layui 针对各种表单元素做了较为全面的UI支持,你无需去书写那些 UI 结构,你只需要写 HTML 原始的 input.select.textarea 这些基本的标签即可.我们在 ...