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

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的解耦拜访

【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年50元

阿里云限时活动-2核2G-5M带宽-60G SSD-1000G月流量 ,特惠价99元/年(原价1234.2元/年,可以直接买3年),速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

You may also like...

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据