struts-base.xml文件详解这是struts2的基础配置文件必须的

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<!-- 设置编码格式 -->
<constant name="struts.i18n.encoding" value="UTF-8" />
<!-- 用于jsp调试,配置这个jsp会报Struts的错 -->
<constant name="struts.devMode" value="true" />
<constant name="struts.configuration.xml.reload" value="true" />
<constant name="struts.i18n.reload" value="true" />
<!-- 动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />

<!-- name 是必须配置的 Package的表示,为了让其他的package引用 -->
<!-- extends 否 从哪个package继承行为 -->
<!-- namespace 否 参考Namespace配置说明 -->
<!-- abstract 否 -->
<!-- 定义这个package为抽象的,这个package中不需要定义action -->
<!-- 这里是因为分组开发所以将 -->
<package name="base" extends="struts-default" abstract="true">
<!-- struts2.5之后动态调用需要匹配正则 不是很推荐使用 2.5之前不需要添加 -->
<global-allowed-methods>regex:.*</global-allowed-methods>
</package>
</struts>

用户基础文件struts-xx.xml分组开发时多个文件的配置

配置这个文件继承于刚才配置的基础文件用来配置action

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<!-- name 是必须配置的 Package的表示,为了让其他的package引用 -->
<!-- extends 否 从哪个package继承行为 -->
<!-- namespace配置之后方便分组开发 然后配置之后请求的时候注意加上名字空间的值 -->
<package name="sy" extends="base" namespace="/sy">
<action name="请求的action" class="你写的类的全路径限定名" method="方法名">
<!-- 结果码的处理 -->
<result name="方法返回值">/跳转地址</result>
</action>
<!-- {1}代表* jsp写法nameaction_add method的值会自动转变为add-->
<!-- *可以有多个 -->
<action name="nameaction_*_*" class="你写的类的全路径限定名" method="{1}">
<!-- 结果码的处理 -->
<result name="方法返回值">/跳转地址</result>
</action>
</package>
</struts>
最后配置一个struts.xml文件这样能够很好的解决分组开发冲突问题
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<!-- struts的基本xml文件 -->
<include file="struts-default.xml"></include>
<!-- 刚才的基本文件 -->
<include file="struts-base.xml"></include>
<!-- n个配置文件 -->
<include file="struts-sy.xml"></include>
</struts>

当然如果不想这么写可以配置到一个struts.xml文件中

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="Login" class="com.rcnjtech.action.LoginAction">
<result name="success">/success.jsp</result>
<result name="login">/index.jsp</result>
</action>
</package>
</struts>

配置web.xml  struts2过滤器

Idea是直接会生成的不需要配置,eclipse的全路径限定名可以通过ctrl+shift+t

可以直接搜索找到全路径限定名

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Struts</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

Struts2传值问题

  1. 从浏览器传至后台
/**
* 1.ModelDriven接口传值
* 2.set get 方法传值
* 3.对象导航传值
*/
private Cal cal=new Cal();
private String num1;
private Cal cal2=new Cal();

public String getNum1() {
return num1;
}

public void setNum1(String num1) {
this.num1 = num1;
}

public Cal getCal2() {
return cal2;
}

public void setCal2(Cal cal2) {
this.cal2 = cal2;
}
public String execute() {
System.out.println("ModelDriven传值:"+"num1"+cal.getNum1()+" num2:"+cal.getNum2());
System.out.println("get set传值:"+this.num1);
System.out.println("对象导航传值:"+"num1"+cal2.getNum1()+" num2:"+cal2.getNum2());
return null;

}
@Override
public Cal getModel() {
// TODO Auto-generated method stub
return cal;
}

请求数据:

Struts2的入门之配置文件和传值问题_apache

结果:

Struts2的入门之配置文件和传值问题_Struts2入门_02

如果modeldriven和get  set 同时使用 而属性名重复的话会造成  get  set

赋值为空的情况因为ModelDriven中优先级更高

从后台传至浏览器传值

* 二.服务端向浏览器传值

 * 1.传统作用域向jsp传值

 * 与j2ee容器交互

 * 1.非注入

 * 耦合

 * 解耦

 * 2.注入式

 *耦合

 * 解耦

 * 2.值栈传值

 

1注入式需要实现ServletRequestAware,RequestAware,ServletResponseAware等接口

ServletRequestAware等接口是高耦合的方式

private HttpServletRequest req;
@Override
public void setServletRequest(HttpServletRequest arg0) {
//使用此request将值放置此作用域中
this.req=arg0;
}

//RequestAware等接口是低耦合方式
@Override
public void setRequest(Map<String, Object> map) {
//可以直接将值存放于此集合中 和request.setattribute是一样的
map.put("rs", "4567890");
}

  1. ServletRequestAware这个接口中的方法是setServletRequest(HttpServletRequest request) 可以获得这次请求的request对象
    3、RequestAware这个接口中的方法是setRequest(Map request) 它只能够获得这次请求中包含request对象中全部attributes的一个map
  2. 非注入式

高耦合使用方式直接可以获得到request对象

其余的session等同理获得

 ServletActionContext.getRequest()

//低耦合的使用可以(推荐使用)
// 获取request:
//
// Map request = (Map)ActionContext.getContext().get("request");
//
// 往request里封装数据
//
// request.put("name", value);
//
// 在前台就可以用request.getAttribute("name");

//获取session
Map session = ActionContext.getContext().getSession();
// 将数据封装到session中
session.put("name", value);
// 在前台页面上用sessionScope.getAttribute("name");得到session里面封装的值。
//得到session、request有点区别,得到request用的是get("reqeust"),得到session用的
//是getSession()
//然后还可以这么使用
ActionContext ctx = ActionContext.getContext();
HttpServletRequest request = (HttpServletRequest)ctx.get(ServletActionContext.HTTP_REQUEST);
HttpServletResponse response = (HttpServletResponse)ctx.get(ServletActionContext.HTTP_RESPONSE);

//用法就和Servlet中的request、response用法一样

值栈传值

//直接定义一个object 保存值然后设置其getset方法即可
private Cal cal=new Cal();
private Object res;
public Object getRes() {
return res;
}
public void setRes(Object res) {
this.res = res;
}
public String add() {
this.res=Integer.parseInt(cal.getNum1())+Integer.parseInt(cal.getNum2());
// ServletActionContext.getRequest().setAttribute("rs", Integer.parseInt(cal.getNum1())+Integer.parseInt(cal.getNum2()));
return "success";}