zoukankan      html  css  js  c++  java
  • Struct2

    Struct2
    Servlet APIs标准需要了解

    创建struct2
    1、创建java项目 勾选struct2 或者先创建然后把struct2中的lib放到项目web中的lib,不要选download,选本地加载(min包),因为idea对这个jar包加载失败
    2、创建web-inf/classes 和lib
    3、File -> Project Structure->Models->Paths->勾选"Use module compile output path" -> 将Output path和Test output path都选择刚刚创建的classes文件夹。
    File -> Project Structure->Models->Dependencies -> 点击右边的“+”号 -> 选择1 “Jars or Directories”-> 选择刚刚创建的lib文件夹
    File -> Project Structure->Artifact-选中刚才的lib->右键项目名称->点击 put into output Root->apply
    Edit Configurations-> 选择刚刚建立的Tomcat容器 -> 选择Deployment -> 点击右边的“+”号 -> 选择Artifact->选择web项目->Application context可以填“/"
    把web.xml的ng删掉
    server log乱码 :
    第一步:修改intellij idea配置文件:
    找到intellij idea安装目录,bin文件夹下面idea64.exe.vmoptions和idea.exe.vmoptions这两个文件,分别在这两个文件中添加:-Dfile.encoding=UTF-8
    第二步:找到intellij idea的file---settings---Editor---FileEncodings的GlobalEncoding和ProjectEncoding和Default encoding for properties都配置成UTF-8
    第三步:在部署Tomcat的VM options项中添加:-Dfile.encoding=UTF-8

    4、struts 配置
    备注两点:
    1、在struts.xml的<constant> 的也可以在src下的struts.properties中定义成struts.i18n.encoding=utf-8,也可以引入其他文件<include>
    2、在package下定义 拦截器 interceptors 全局result global-results action配置 action 默认class default-class-ref 默认action default-action-ref
    struts.xml的常用配置
    https://www.cnblogs.com/fingerboy/p/5183663.html
    https://www.cnblogs.com/wkrbky/p/5889328.html
    https://www.cnblogs.com/yangyabo/p/5358765.html
    5、struts中的action类创建
    1、POJO类,就是自己写一个不继承别人的
    2、继承别人的com.opensymphony.xwork2.ActionSupport,里面有6个属性方法:
    public static final String SUCCESS = "success"; // 数据处理成功 (成功页面)
    public static final String NONE = "none"; // 页面不跳转 return null; 效果一样
    public static final String ERROR = "error"; // 数据处理发送错误 (错误页面)
    public static final String INPUT = "input"; // 用户输入数据有误,通常用于表单数据校验 (输入页面)
    public static final String LOGIN = "login"; // 主要权限认证 (登陆页面)
    public String execute() throws Exception;
    6、Action详解:
    https://www.cnblogs.com/xiaolongSunny/p/4637486.html
    一、创建
    二、调用
    1、静态调用
    2、通配符+{1}
    3、action+"!"+方法名
    动态添加中,用了好几次都不行,在properties添加动态属性不让用,直接在struts.xml中使用
    问题二、不让用自定义的方法,就得配置让用的方法,不可以用global-allowed-methods,这一个是覆盖不是添加
    方法一、如果要在struts中添加新方法,在strut2中,不让直接用allowed,需要在package先设置是否严格控制新方法:
    <package name="helloworld" extends="struts-default" strict-method-invocation="false">
    方法二、如果要设置为true,需要在action子包设置<allowed-methods>login,registe</allowed-methods>
    方法三、@AllowedMethods("end")
    public class ClassLevelAllowedMethodsAction {
    三、搜索顺序
    从最后一个文件夹往上走,找不到去默认namespace,找不到失败
    四、默认值
    7、拦截器和过滤器的区别:
    1. 拦截器和过滤器的概念非常类似。
    2. 过滤器隶属于web容器,可以过滤一切请求(包括action、servlet、jsp、html等等)。
    3. 而拦截器隶属于struts2框架,只能拦截action(无法拦截对jsp的请求)。
    4. 过滤器内部采用函数回调来实现。拦截器采用动态代理来实现!
    8、拦截器顺序:
    拦截器内部需要,使用ActionInvocation.invoke(),来执行链条,在这命令之前的是action之前执行,在这命令之后的是action之后执行
    如果没有调用ActionInvocation.invoke(),应该返回对应的String,然后找到相对应的网页返回
    9、拦截器堆栈
    <interceptor-stack name="basicStack">
    <interceptor-ref name="exception"/>
    <interceptor-ref name="servlet-config"/>
    <interceptor-ref name="prepare"/>
    <interceptor-ref name="checkbox"/>
    <interceptor-ref name="params"/>
    <interceptor-ref name="conversionError"/>
    </interceptor-stack>
    <action name="hello" class="com.tutorialspoint.struts2.MyAction">
    <interceptor-ref name="basicStack"/>
    <result>view.jsp</result>
    </action>
    10、struts中chain
    struts中的chain是共享valuestack,但是也是共享表单的,因为被赋值两次,以表单为最后标准,
    如果先经过action1,然后经过action2,都是用的表单数据
    11、struts中的结果类型
    https://www.cnblogs.com/zxf330301/articles/5338683.html
    默认是dispatcher,返回jsp
    freemaker 与jsp解耦,返回其他别的
    redirect 跳转页面,网址变化,如果要用原来的值,需要在url中重新?xxx=111
    redirectAction 跳转action,重新申请,如果要获取原来的值,需要用param 重新赋值
    chain 不跳转网址,只跳转action,共享valuestack
    12、值栈,actioncontext
    https://blog.csdn.net/ambow_cq/article/details/7458810
    每个action对应值栈对象,发送请求时,会创建一个action对象和值栈,把action对象的属性放入到值栈
    在jsp中通过<s:debug/>查看栈
    ognl是值栈的默认实现,
    获取值栈:
    在拦截器中:ActionInvocation.getStack()
    在action中:ActionContext.getContext().getValueStack()
    值栈存值:
    Action对象自动存入值栈
    拦截器或者Action中:valuestack.put(obj,obj)后面是个map,一般为map<string,obj>
    JSP中:<s:push value="..."></s:push>但value被放入值栈的时间仅在s:push标签内,
    获取值:
    拦截器或者Action中:valuestack.findvalue(key)
    JSP中:<s:property/>如果标签的属性不是直接执行Ognl表达式的,则需要使用“%{}”将表达式括起来
    在JSP中跳过栈顶元素直接访问第二层:
    在JSP中,使用[0]、[1]等表达式来指定从栈的第几层开始执行表达式。[0]表示从栈顶开始,[1]表示从栈的第二层开始。比如表达式“name”等价于“[0].name”
    在表示式中使用top关键字来访问对象本身。比如,表达式“name”等价于“top.name”,表达式“[0].top”等价于“top”
    13、struts2数据库操作
    https://blog.csdn.net/feixia_24/article/details/51546929
    statement:
    con = JDBCConAndClo.getConnectionBao()
    Statement stm= con.createStatement();
    con.setAutoCommit(false);
    stm.addBatch("insert into student values(23,'tangbao','高数',100)");
    stm.addBatch("insert into student values(24,'王定','c#',98)");
    stm.executeBatch();
    con.commit();
    con.setAutoCommit(true);
    prepareStatement:
    con = JDBCConAndClo.getConnectionBao();
    pstm = con.prepareStatement("insert into student values(?,?,?,?)");
    con.setAutoCommit(false);
    pstm.setInt(1, 33);
    pstm.setString(2,"wangqin");
    pstm.setString(3, "c++");
    pstm.setDouble(4, 78.5);
    pstm.addBatch();
    pstm.setInt(1, 34);
    pstm.setString(2,"wuytun");
    pstm.setString(3, "c");
    pstm.setDouble(4, 77);
    // 3) 将一组参数添加到此 PreparedStatement 对象的批处理命令中。
    pstm.addBatch();
    stm.executeBatch();
    con.commit();
    con.setAutoCommit(true);
    struts发送email
    需要mail.jar
    struts 验证
    1、自定义验证执行顺序
    执行顺序 validate----->excute
    如果struts中有validate,里面调用addFieldError("name","需要"),则之后不调用excute,如果没调用addFieldError,之后还是执行excute
    XML验证
    假设有一个类,Employee,在类旁边加一个,Employee-validation.xml,表示对类数据的验证
    <validators>
    <field name="name">
    <field-validator type="required">
    <message>
    The name is required.
    </message>
    </field-validator>
    </field>

    <field name="age">
    <field-validator type="int">
    <param name="min">29</param>
    <param name="max">64</param>
    <message>
    Age must be in between 28 and 65
    </message>
    </field-validator>
    </field>
    </validators>
    struts 类型转换
    Integer,Float,Double,Decimal
    Date,Datetime
    Arrays,Collections
    Enumerations
    Boolean
    BigDecimal
    对于内置类型,会自动转换
    对于自定义类型,则会调用toString方法
    如果想要自定义转换器,则需要重新写一个:继承StrutsTypeConverter
    public class EnvironmentConverter extends StrutsTypeConverter {
    @Override
    public Object convertFromString(Map context, String[] values,
    Class clazz) {
    Environment env = new Environment(values[0]);
    return env;
    }

    @Override
    public String convertToString(Map context, Object value) {
    Environment env = (Environment) value;
    return env == null ? null : env.getName();
    }
    }
    必须声明一下什么类用这个转换器,两种方法:
    1、局部声明:
    在action包内加'[action-class]'-conversion.properties这个文件
    内部:environment=cn.w3cschool.struts2.EnvironmentConverter
    2、全局声明:
    在src或者web-inf/classes内添加xwork-conversion.properties文件
    cn.w3cschool.struts2.Environment = cn.w3cschool.struts2.EnvironmentConverter
    主题和模板
    设置主题:
    提供了4个主题:simple,xhtml,css_xhtml和ajax
    通过标签上的theme属性来指定主题
    通过标签外围的Form标签的theme属性来指定主题
    通过page/request/session/application会话范围以theme为名称的属性来确定主题
    通过struts.ui.theme的常量确定主题,默认是xhtml,该常量在struts.properties或者struts.xml文件确定
    设置模板目录:
    通过struts.ui.templateDir常量来指定的,该常量的默认值是template。
    CLASSPATH(包括Web应用的WEB-INF/classes路径和WEB-INF/lib路径)的template目录来依次加载特定模板文件。
    则加载模板文件的顺序为:
    1,搜索Web应用里/template/xhtml/select.ftl文件
    2,搜索CLASSPATH路径下的template/xhtml/select.ftl文件
    设置模板:
    模板文件是.ftl文件,它是FreeMarker的模板文件。
    修改struts.ui.templateSuffix常量的值来改变Struts2默认的模板技术
    该常量接受如下几个值:
    ftl:基于FreeMarker的模板技术
    vm:基于Velocity的模板技术
    jsp:基于JSP的模板技术
    扩展一个现有的主题
    select.ftl文件代码如下:
    <!-- 加入自己的文字部分 -->
    <h3>作者李:</h3>
    <!-- 包含xhtml主题下的controlheader.ftl模板 -->
    <#include "/${parameters.templateDir}/xhtml/controlheader.ftl" />
    <!-- 包含simple主题下的select.ftl模板 -->
    <#include "/${parameters.templateDir}/simple/select.ftl" />
    <!-- 包含xhtml主题下的controlfooter.ftl模板 -->
    <#include "/${parameters.templateDir}/xhtml/controlfooter.ftl" />
    该文件放在Web应用的WEB-INF/classes/template/lee路径下,这表明创建了一个自定义模板,该模板名为lee
    还必须在主题目录下增加一个theme.properties文件,该文件指定自定义模板是以哪个模板为基础进行扩展的,文件内容为:parent=xhtml

    使用:
    <%@taglib prefix="s" uri="/struts-tags"%>
    <s:select name="aa" theme="lee" list="{'Spring2.0' , 'J2EE' , 'Ajax'}" size="3"/>
    表单标签的name和value属性
    <!-- 将下面文本框的值绑定到Action的person属性的firstName属性 -->
    <s:textfield name="person.firstName" />
    <!-- 使用表达式生成表单元素的值 -->
    <s:textfield name="person.firstName" value="${person.firstName}" />

    <s:form>
    <!-- 使用简单集合来生成多个复选框 -->
    <s:checkboxlist name="a" label="请选择您喜欢的图书" labelposition="top"
    list="{'Spring2.0' , 'J2EE' , 'Ajax'}"/>
    <!-- 使用简单Map对象来生成多个复选框 -->
    <s:checkboxlist name="b" label="请选择您想选择出版日期" labelposition="top"
    list="#{'Spring2.0':'2006年10月' , 'J2EE':'2007月4月' , 'Ajax':'2007年6月'}"
    listKey="key"
    listValue="value"/>
    <s:bean name="lee.BookService" id="bs"/>
    <!-- 使用集合里放多个JavaBean实例来生成多个复选框 -->
    <s:checkboxlist name="b" label="请选择您喜欢的图书" labelposition="top"
    list="#bs.books"
    listKey="name"
    listValue="author"/>
    </s:form>
    模板和主题:https://blog.csdn.net/memory_xj/article/details/3390591
    struts 注释类型:
    https://www.w3cschool.cn/struts_2/struts_annotations_types.html
    @Results({
    @Result(name="success", value="/success.jsp"),
    @Result(name="error", value="/error.jsp")
    })

    struts 标签https://www.cnblogs.com/yw-ah/p/5760540.html
    struts 控制标签
    if/else:
    <s:if test="%{false}">
    <div>Will Not Be Executed</div>
    </s:if>
    <s:elseif test="%{true}">
    <div>Will Be Executed</div>
    </s:elseif>
    <s:else>
    <div>Will Not Be Executed</div>
    </s:else>
    iterator
    iterator将迭代一个值。可迭代值可以是以下任一值:java.util.Collection,java.util.Iterator
    使用SubSet标签来获取列表或数组的子集
    <s:iterator value="days">
    <p>day is: <s:property/></p>
    </s:iterator>
    merge
    append
    generator
    需要知道什么类型用那种标签
    strut2 数据标签
    action标签
    strut2 表单标签

    strut2 Ajax标签
    在head内部初始化ajax <sx:head />




    支付宝     
    您的资助是我最大的动力!
    金额随意,欢迎来赏!
    微信

    如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的关注我

    如果,想给予我更多的鼓励,求打       付款后有任何问题请给我留言!!!

    ------------------------------------------------------------------------------------------
    作者:【周sir】
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    unable to retrieve container logs for docker kubernetes
    Restart container within pod
    Kubernetes1.3:POD生命周期管理
    Options of the DB storage of prometheus
    prometheus重启hang住问题记录
    prometheus交流资源
    nc 从服务器上传下载文件
    负载均衡监控需求
    prometheus消耗内存问题
    10.Docker 镜像使用
  • 原文地址:https://www.cnblogs.com/zhouguanglu/p/10514486.html
Copyright © 2011-2022 走看看