关于java:Java开发之Struts框架项目中应用说明

48次阅读

共计 10784 个字符,预计需要花费 27 分钟才能阅读完成。

Struts1 最早的一种基于 mvc 模式的框架;
Struts2 是在 Struts1 的根底上,交融了 xwork 的性能;
也能够说,Struts2 = struts1 + xwork Struts2 框架事后实现了一些性能:

  1. 申请数据主动封装
  2. 文件上传的性能
  3. 对国际化性能的简化
  4. 数据效验性能
    SSH 框架在 mvc 模式的的地位作用:

    Struts2 入门示例
    Struts 开发步骤:
  5. web 我的项目,引入 struts – jar 包
    commons-fileupload-1.2.2.jar【文件上传相干包】
    commons-io-2.0.1.jar
    struts2-core-2.3.4.1.jar【struts2 外围性能包】
    xwork-core-2.3.4.1.jar【Xwork 外围包】
    ognl-3.0.5.jar【Ognl 表达式性能反对表】
    commons-lang3-3.1.jar【struts 对 java.lang 包的扩大】
    freemarker-2.3.19.jar【struts 的标签模板库 jar 文件】
    javassist-3.11.0.GA.jar【struts 对字节码的解决相干 jar】
    留神:应用的 struts 的 struts2-core-2.3.4.1.jar 版本不同,外围​​java 培训​​过滤器类是不一样的!
  6. web.xml 中,引入 struts 的外围性能 配置过滤器
    <!– 引入 struts 外围过滤器 –><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>
  7. 开发 action
    package demo;
    import com.opensymphony.xwork2.ActionSupport;
    public class HelloAction extends ActionSupport {// 解决申请 public String execute() throws Exception {
    System.out.println(“ 拜访到了 action,正在解决申请 ”);
    System.out.println(“ 调用 service”);
    return “success”;
    }
    }
    留神:
  8. action 类,也叫做动作类; 个别继承 ActionSupport 类 即解决申请的类 (struts 中的 action 类取代之前的 servlet)
  9. action 中的业务办法,解决具体的申请 > 必须返回 String > 办法不能有参数
  10. 配置 action src/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=”xxx” extends=”struts-default”>
    <action name=”hello” class=”demo.HelloAction” method=”execute”>
    <result name=”success”>/success.jsp</result>
    </action>
    </package>
    </struts>
    执行流程:服务器启动:
    1. 加载我的项目 web.xml
  11. 创立 Struts 外围过滤器对象,执行 filter init()
    • struts-default.xml:外围性能的初始化
    • struts-plugin.xml:struts 相干插件
    • struts.xml:用户编写的配置文件

拜访:

  1. 用户拜访 Action, 服务器依据拜访门路名称,找对应的 aciton 配置, 创立 action 对象
  2. 执行默认拦截器栈中定义的 18 个拦截器
  3. 执行 action 的业务解决办法
    struts-default.xml 详解
    目录:struts2-core-2.3.4.1.jar/ struts-default.xml
    内容:
    1.bean 节点指定 struts 在运行的时候创立的对象类型
    2. 指定 struts-default 包【用户写的 package(struts.xml) 一样要继承此包】package struts-default 包中定义了:
    a. 跳转的后果类型
    • dispatcher 转发,不指定默认为转发
    • redirect 重定向
    • redirectAction 重定向到 action 资源
    • stream (文件下载的时候用)

b. 定义了所有的拦截器
• 定义了 32 个拦截器!
• 为了拦截器援用不便,能够通过定义栈的形式援用拦截器,
• 此时如果援用了栈,栈中的拦截器都会被援用!
• defaultStack 默认的栈,其中定义默认要执行的 18 个拦截器!

c. 默认执行的拦截器栈、默认执行的 action
default-interceptor-ref name=”defaultStack”/> <default-class-ref class=”com.opensymphony.xwork2.ActionSupport” />
<interceptor name=”prepare” class=”com.opensymphony.xwork2.interceptor.PrepareInterceptor”/>
<interceptor name=”params” class=”com.opensymphony.xwork2.interceptor.ParametersInterceptor”/>
拦截器:
拦截器性能与过滤器性能相似。
共同点:都拦挡资源!
区别:过滤器,拦截器所有资源都能够;
(/index.jsp/servlet/img/css/js) 拦截器,只拦挡 action 申请。
拦截器是 struts 的概念,只能在 struts 中用。
过滤器是 servlet 的概念,能够在 struts 我的项目、servlet 我的项目用。
面试题:拦截器什么时候执行?(拜访 / 启动) 先执行 action 类创立,先执行拦截器?

  1. 用户拜访时候按程序执行 18 个拦截器;
  2. 先执行 Action 类的创立,再执行拦截器;最初拦截器执行完,再执行业务办法
    常量_Action 配置门路_通配符
    Struts2 中罕用的常量
    指定默认编码集, 作用于 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″/>
    constants.xml
    <?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><!– 一、全局配置 –>
<!– 0. 申请数据编码 –><constant name=”struts.i18n.encoding” value=”UTF-8″/><!– 1. 批改 Struts 默认的拜访后缀 –><constant name=”struts.action.extension” value=”action,do,”></constant><!– 2. 批改 xml 主动从新加载 –><constant name=”struts.configuration.xml.reload” value=”true”/><!– 3. 开启动静办法调用 (默认不开启)–><constant name=”struts.enable.DynamicMethodInvocation” value=”true”/><!– 4. 批改上传文件的最大大小为 30M –><constant name=”struts.multipart.maxSize” value=”31457280″/>

</struts>
Struts2 中指定多个配置文件
src/struts.xml
<?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><!– 总配置文件:引入其余所有配置文件 –><include file=”constant.xml”></include>
</struts>
Struts2 的 Action 名称搜寻机制
1、取得申请门路的 URI,例如 url 是:
/Struts2_01/hello_a/a/b/helloWorld.action
2、首先查问 namespace 为 /hello_a/a/ b 的 package,
如果存在这个 package,则在这个 package 中查问名字为 helloWorld 的
action,如果不存在这个 package 则转步骤 3
3、查问 namespace 为 /hello_a/ a 的 package,
如果存在这个 package,则在这个 package 中寻找名字为 helloWorld 的
action,如果不存在这个 package,则转步骤 4
4、查问 namespace 为 /hello_a 的 package,
如果存在这个 package,则在这个 package 中寻找名字为 helloWorld 的
action,如果依然不存在这个 package,则转步骤 5
5、查问默认的 namaspace 的 package
查问名字为 helloWorld 的 action(默认的命名空间为空字符串“/”)
如果还是找不到,页面提醒 404 找不到 action 的异样
Strust2 中 Action 配置项的默认值
Action 没有配置 class 属性的默认值 struts-default.xml
<?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=”noClass” namespace=”/” extends=”struts-default” >
<action name=”helloWorld” >
<result name=”success”>/success.jsp</result> <!– 没有指定 class 属性 –></action>
</package>
</struts>
配置拜访门路:“/noClass/helloWorld.action
ActionSupport 的 execute()返回 success
result 没有指定 name 那么默认值是 success
配置默认的 Action 解决找不到的 Action 匹配异样
<default-action-ref name=”defaultGoTo”>

</default-action-ref>
<action name=”defaultGoTo” class=”com.loaderman.a_config.UserAction2″ >
<result name=”success”>/index.jsp</result>
</action>
Struts2 解决申请后缀机制
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 是 Struts2 中的外围控制器,该 Filter 次要的工作是拦挡用户 /* 的所有申请。如果申请的门路中带后缀为.action 或没有带后缀,此时将申请交给 Struts2 框架解决。否则不做任何解决。例如:申请门路为 /index.jsp 间接拜访页面
Struts2 配置常量程序
除了在 struts.xml 中配置自定义的后缀以外,还能够在我的项目的 src 目录下通过创立 struts.properties
文件来配置常量:struts.action.extension=action.
Struts2 配置文件加载的程序
struts-default.xml
strtus-plugin.xml
struts.xml
struts.properties (用户自定义配置文件)
因而 struts.properties 中配置的常量会笼罩 struts.xml 中的常量配置!
Struts2 的 resultType
默认的 result 类型是申请转发

留神: dispatcher 只是申请转发,不能转发到内部的资源,只能在本利用中转发,如果要跨利用拜访资源,须要应用重定向。
resultType 之 redirect

resultType 之 redirectAction

Struts2 通配符映射机制
一个 Web 利用可能有成千盈百个 action 申明. 能够利用 struts 提供的通配符映射机制把多个彼此类似的映射关系简化为一个映射关系
通配符映射规定
• 若找到多个匹配, 没有通配符的那个将胜出
• 若指定的动作不存在, Struts 将会尝试把这个 URI 与任何一个蕴含着通配符 * 的动作名及进行匹配
• 若 Struts 找到的带有通配符的匹配不止一个, 最初一个匹配将胜出
• 被通配符匹配到的 URI 字符串的子串能够用 {1}, {2} 来援用. {1} 匹配第一个子串, {2} 匹配第二个子串… {0} 匹配整个 URI
• 能够匹配零个或多个字符, 但不包含 / 字符. 如果想把 / 字符包含在内, 须要应用 **. 如果须要对某个字符进行本义, 须要应用 .


struts2 数据处理的几种形式
package com.loaderman.c_data;

import java.util.Map;

import javax.servlet.ServletContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;/**

  • 数据处理
    *
    */public class DataAction_bak extends ActionSupport{

@Override
public String execute() throws Exception {// 1. 申请数据封装;2. 调用 Service 解决业务逻辑,拿到后果数据
// 3. 数据保留到域中
/*
*
// Struts 中对数据操作,形式 1:间接拿到 ServletApi, 执行操作
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
ServletContext application = ServletActionContext.getServletContext();
// 操作
request.setAttribute(“request_data”, “request_data1”);
session.setAttribute(“session_data”, “session_data1”);
application.setAttribute(“application_data”, “application_data1”);
*/
//【举荐:解耦的形式实现对数据的操作】
// Struts 中对数据操作,形式 2:通过 ActionContext 类 ActionContext ac = ActionContext.getContext();// 失去 Struts 对 HttpServletRequest 对象进行了封装,封装为一个 map
// 拿到示意 request 对象的 mapMap<String,Object> request = ac.getContextMap();// 拿到示意 session 对象的 mapMap<String, Object> session = ac.getSession();// 拿到示意 servletContext 对象的 mapMap<String, Object> application = ac.getApplication();// 数据 request.put(“request_data”, “request_data1_actionContext”);
session.put(“session_data”, “session_data1_actionContext”);
application.put(“application_data”, “application_data1_actionContext”);

return SUCCESS;
}
}
package com.loaderman.c_data;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import java.util.Map;/**

  • 数据处理, 形式 3:实现接口的办法
    */public class DataAction extends ActionSupport implements RequestAware, SessionAware, ApplicationAware {

private Map<String, Object> request;
private Map<String, Object> session;
private Map<String, Object> application;// struts 运行时候,会把代表 request 的 map 对象注入 @Override
public void setRequest(Map<String, Object> request) {
this.request = request;
}// 注入 session@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}// 注入 application@Override
public void setApplication(Map<String, Object> application) {
this.application = application;
}

@Override
public String execute() throws Exception {// 数据 request.put(“request_data”, “request_data1_actionAware”);
session.put(“session_data”, “session_data1_actionAware”);
application.put(“application_data”, “application_data1_actionAware”); return SUCCESS;
}

}
Struts2 自定义类型转换器
package com.loaderman.d_type;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import org.apache.struts2.util.StrutsTypeConverter;/**

  • 自定义类型转换器类
    */public class MyConverter extends StrutsTypeConverter {// 新需要:要求我的项目中要反对的格局, 如: yyyy-MM-dd/yyyyMMdd/yyyy 年 MM 月 dd 日..
    // 先定义我的项目中反对的转换的格局 DateFormat[] df = { new SimpleDateFormat(“yyyy-MM-dd”),
    new SimpleDateFormat(“yyyyMMdd”),
    new SimpleDateFormat(“yyyy 年 MM 月 dd 日 ”) };/**
  • 把 String 转换为指定的类型【String To Date】
    *
  • @param context
  • 以后上下文环境
  • @param values
  • jsp 表单提交的字符串的值
  • @param toClass
  • 要转换为的指标类型
    */@Override
    public Object convertFromString(Map context, String[] values, Class toClass) {// 判断: 内容不能为空 if (values == null || values.length == 0) {
    return null;
    }// 判断类型必须为 Dateif (Date.class != toClass) {
    return null;
    }// 迭代:转换失败持续下一个格局的转换;转换胜利就间接返回 for (int i=0; i<df.length; i++) {
    try {
    return df[i].parse(values[0]);
    } catch (ParseException e) {
    continue;
    }
    }
    return null;
    }

@Override
public String convertToString(Map context, Object o) {
return null;
}

}
Struts2 中如何自定义类型转换器?实现类 Struts2 中如何配置自定义转换器?
1、自定义转换器继承 StrutsTypeConverter
2、重写 convertFromString 和 convertToString 办法
3、注册转换器
a. 在 Action 所在包中建设
Action 名 -conversion.properties
b. 在 a. 文件中增加以下数据
须要转换的字段名 = 自定义转换器类的权限定名
birthday=cn.loaderman.convertor.DateTypeConvertor
总结:
以上的转换器注册时候是与 Action 的名字相耦合的, 因而只能在本人的 Action 中外部使 用,称之为部分转换器注册形式。
Struts2 中如何自定义全局类型转换器?
实现的接口和继承的类都是雷同的,实质上就是配置的形式不同。
1、自定义转换器继承 StrutsTypeConverter
2、重写 convertFromString 和 convertToString 办法
3、注册转换器
a. 在我的项目 src 目录下建设以下固定文件
xwork-conversion.properties
b. 在 3.1 文件中增加以下数据 须要转换的类类型 = 转换器类的权限定名 如:
java.util.Date= cn.loaderman.converter.DateConverter
总结:
该拦截器负责对错误信息进行拦截器
<interceptor name=”conversionError“class=”org.apache.struts2.interceptor.StrutsConversionErrorInterceptor”/>
Struts2 中部分和全局转换器的注册文件名为什么是固定的?
1、struts-default.xml
<interceptor name=”conversionError” class=”org.apache.struts2.interceptor.StrutsConversionErrorInterceptor”/>
2、StrutsConversionErrorInterceptor 源码
3、2 的父类 ConversionErrorInterceptor 源码
4、intercept() 办法中的 XWorkConverter 源码
5、XWorkConverter

Struts2 类数据封装

Struts2 与 Servlet API 的解耦拜访

正文完
 0