Struts常量: 用于改变struts框架的默认行为(如: 改变编码)可以定义在
在 struts.xml struts.properties web.xml 中定义
加载顺序: 从左到右
覆盖顺序:从右到左
1. 在struts.xml 中 通过<constant name=”常量属性名” value=”常量值”/> 配置常量
.properties文件:都是程序中使用的属性文件,在其中一般以键值对形式存储数据,方便修改
2. 在src下创建 struts.properties文件,在其中以属性名=值得形式存储变量struts.i18n.encoding=UTF-8
设置struts的编码为UTF-8,默认值就是 utf-8
3. 在web.xml 中通过设置 (一般不用)
<init-param>
<param-name></param-name>
<param-value></param-value>
</init-param>
建议:在实际开发中不建议在 web.xml 中配置常量,如果常量较少可以再struts.xml中配置,如果常量较多一般都是选择直接定义在 struts.properties文件方式
包:
<package name="default" namespace="/"extends="struts-default">
<default-action-refname="index" />
<action name="Username" class="test.UsernameAction">
<result name="success">success.jsp</result>
<result name="error">error.jsp</result>
</action>
</package>
Name:必须属性,指明被引用时的名称
Namespace:可选属性
Extends:指定继承默认的包,可选属性
默认包中有结果类型定义,拦截器及其引用
命名空间:解决同名的action问题,同一命名空间不能出现相同名的action
namespace="/" 表示默认命名空间 命名空间错误会出现异常
struts2 搜索action 的顺序:
1. 找指定命名空间的action
2. 找默认命令空间的action
3. 如果还没有找到,就会抛出异常
在Struts.xml 中引用其他xml 文件
<include file ="文件地址"> </include> 将其他xml文件的类容引用到 Struts.xml
定义action 有三种方式:
1.普通的pojo类,pojo类 一般有一个execute()方法,返回值为String 类型, Struts底层自己会调用,
2.实现action接口
3.继承ActionSupport类
eg:
index.jsp界面 分别把上面三种方法做测试
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>pojo 实现 action</h1>
姓名:<form action="Username.action">
<input type="text" name="username" >
<input type="submit" value="提交">
</form>
<h1>接口实现 action</h1>
姓名:<form action="User.action">
<input type="text" name="username" >
<input type="submit" value="提交">
</form>
<h1>继承实现 action</h1>
姓名:<form action="Extend.action">
<input type="text" name="username" >
<input type="submit" value="提交">
</form>
<a href="Method!add.action?username=zhangsan">测试add</a>
<a href="Method!show.action?username=lisi">测试show</a>
</body>
</html>
编写java action 类
1.pojo 类
public class UsernameAction {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String execute(){
if("zhangsan".equals(username)){
return "success";
}else{
return "error";
}
}
}
2.实现action接口的类
public class UserAction implements Action {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String execute() throws Exception {
if("zhangsan".equals(username)){
return "success";
}else{
return "error";
}
}
}
3.继承方式 (extends ActionSupport)
public class ExtendAction extends ActionSupport {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String execute() throws Exception {
if("zhangsan".equals(username)){
return "success";
}else{
return "error";
}
}
@Override
public void validate() {
if(username.length() < 6){
this.addFieldError("name", "用户名小于6位");
}
}
}
<?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>
<!--说明目前处于开发阶段,目前可以进行调试 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<!-- 运行使用动态命令 -->
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<action name="Username" class="test.UsernameAction">
<result name="success">success.jsp</result>
<result name="error">error.jsp</result>
</action>
<action name="User" class="test.UserAction">
<result name="success">success.jsp</result>
<result name="error">error.jsp</result>
</action>
<action name="Extend" class="test.ExtendAction">
<!-- 配置execute() 返回字符串与对应视图的关系 -->
<result name="success" >success.jsp</result>
<result name="error">error.jsp</result>
<!-- addFieldError() 方法 底层会返回input 这个字符串-->
<result name="input">no.jsp</result>
</action>
</package>
<include file="example.xml" />
<!-- Add packages here -->
</struts>
注: 这里的success.jsp 和 error.jsp 是测试用的 没有给来, 随意写点东西就可以了
在action 中获取servletAPI(内置对象)
1.通过ActionContext 获取:
ActionContext context = ActionContext.getContext();
Map<String,Object> map = context.getSession();
map.get("msg"); //获取session当中的值
map.put("name", "用户名长度大于4"); //设置session的属性 属性名为 name
相当于原来的
HttpServletRequest request = null;
HttpSession session = request.getSession();
session.getAttribute("name"); //获取session当中的值
2.通过实现接口
实现ServletContextAware接口, 可以访问servletContext
实现ServletResponseAware接口, 可以访问HttpServletResponse
实现ServletRequestAware接口,可以访问HttpServletRequest
//使用方式:
private HttpServletRequest request;
public void setServletRequest(HttpServletRequest request){
this.request=request;
}
//在实现接口后创建对应类型变量,重写的接口方法中给变量赋值。然后就可操作内置对象。
HttpSession session = request.getSession();
session.setAttribute(“msg”,”hello world”);
3.通过使用 ServletActionContext 类获取:
ServletActionContext.getRequest().getSession()获取session ,该类为工具类,提供多个static函数
HttpSession session = ServletActionContext.getRequest().getSession();
session.setAttribute(username, "asd");
session.getAttribute(username);
最后一点:Action的配置:
1.普通的请求配置 : 自定义名称.action
简答步骤:
1). 在jsp中请求 <a href = “Method!add.action?name=zhangsan”></a>
2). 在处理Action请求的类中定义 String add()
public String add(){
//其他逻辑代码
return “addrs”;
}
3). 在Struts.xml 中配置action
<action name="method"class="test.MethodAction">
<result name="addrs">/add.jsp</result>
</action>
在action配置中使用method属性
public String add(){
if(){
return"rs1";
}else{
return "rs2";
}
}
<action name="method"class="test.MethodAction" method="add">
<result name="rs1">/add1.jsp</result>
<resultname="rs2">/add2.jsp</result> //测试的jsp 不用管
</action>
<action name="method"class="test.MethodAction" method="show">
<resultname="showrs">/show.jsp</result>
</action>
使用通配符*:
*代表一个或多个任意字符串,在有了通配符后可以再定义Action的name时使用name=“*自定义名称”,然后在定义method时使用method=“{数字}”,数字表示前面的第几个*所代表的字符串。
eg:
<a href="add_Method!add.action?name=zhangsanAdd">添加</a>
<a href="show_Method!show.action?name=lisiShow">展示</a> //页面代码
--------------------------- 分割线
<action name="*_*"class="test.{2}Action" method="{1}"> //Struts.xml代码
<resultname="addrs">/add.jsp</result>
<result name="showrs">/show.jsp</result>
</action>