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 />

 

 




posted @ 2019-03-12 09:10  周sir搞人工  阅读(290)  评论(0编辑  收藏  举报