目录
4.2 Action获取参数-Action编写规则... 9
框架
土木工程:基础的架构
软件工程:
可以重复利用的构件
里面封装了一个流程规则。
好处:
提高开发效率
节约成本
框架已经将一些基础的组件封装起来,直接使用。比如:权限认证框架shiro spring security,利用别人的成果
自定义框架smart-jdbc:
封装jbdc:
1.封装增删改查操作
2.获取链接封装
Struts2
1.1 导入包
将Struts2的包(
commons-fileupload-*.jar、
commons-io-*.jar、
commons-lang-*.jar、
commons-logging-*.jar、
freemarker-*.jar、
javassist-*.jar、
log4j-api-*.jar、
ognl-*.jar、
struts2-core-2.5.jar)添加道lib目录下
1.2 入口配置
- 在web.xml中添加Struts2的过滤器:
-
<filter> <filter-name>Struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>Struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
1.3 主配置
- 在WEB-INF下的classes目录下(当前classpath中)添加一个struts.xml配置文件
-
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> </struts>
2.1 Struts类都以Action为后缀
例如UserAction、HelloWorldAction
- 继承ActionSupport
示例:
public class UserAction extends ActionSupport{
}
2.2 编写Struts.xml
- 定义<package></package>
- 指定属性name,extends的值
- 定义<action></action>
- 指定属性name,class的值
- 指定<result></result>
- Struts2.5需要开启动态方法<constant></constant>
- Struts2.5需要指定被访问的方法<global-allowed-methods>login</global-allowed-methods>
2.3 配置struts.xml的例子
-
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!--constant定义常量,调用动态方法,需要到jar包中的default.propertes中找到struts.enable.DynamicMethodInvocation设置value参数,开启动态间隔 --> <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant> <!-- 定义一个包,继承struts-default,namespace属性参数为"/"是相对根目录的路径 --> <package name="action" extends="struts-default" namespace="/"> <!-- 允许某个方法被用户访问,如果有多个方法要被访问,需要通过,逗号间隔 --> <global-allowed-methods>login</global-allowed-methods> <!-- 定义一个action,用于绑定一个class,以及对应的请求入口 --> <action name="useraction" class="com.gist.action.UserAction" method="login"> <!-- result的name属性是方法的返回值,/view/login.jsp表示是需要跳转的页面 --> <result name="login">/view/login.jsp</result> </action> </package> </struts>
2.4 生成url
http://localhost:8080/2017Struts/useraction!login.action
2017Struts是项目名称
useraction!login.action
useraction是对应action name属性
login是对应action method属性
.action是默认后缀
方法调用:
默认方法、指定方法、动态方法、通配符
3.1 默认方法
约定
默认执行Action的execute方法
配置示例:
访问Url:http://localhost:8080/strutsdemo/defaultaction.action
3.2 指定方法
约定
在Action定义一个public方法(除execute)
配置示例:
访问的Url:http://localhost:8080/strutsdemo1/loginaction.action
3.3 动态方法
场景
在Action定义多个public 方法(除execute)
任意调用其中一个方法
配置示例:
访问的Url:http://localhost:8080/strutsdemo1/useraction!login.action
3.4 动态方法-通配符
规则
在配置<action.../>元素时,需要指定name、class、method属性。其中name属性可支持通配符,然后可以在class、method属性中使用表达式。通配符用星号 * 表示。
通配符:可以理解成一个表达式,*是代表0个或者一个或多个的字符
在struts里面,如果用通配符,比如user*action,在设置方法的时候,不需要手动设置,只需要引用通配符的值,比如*的值
可以用表达式引用*的值,比如{1} ,1是代表第一个*
缺点:
一个页面对应多个返回值的时候,无法实现,在做增删改查的时候适用
配置示例
访问的Url:http://localhost:8080/strutsdemo1/userlogin.action
- Action获取单值参数
- 页面获取单值参数
- 传递/获取对象
- 传递/获取集合
输入页面login.jsp
<%@ page language="java" contentType="text/html" 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">
<title>Insert title here</title>
</head>
<body>
<form action="/strutsdemo1/loginaction!login.action">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit">
</form>
</body>
</html>
4.2 Action获取参数-Action编写规则
将参数名作为private属性,并提供set/get方法
参数类型:
String :单个值传输
String[]/List<String> 多个值传输
为属性赋值:
this.name = charles
this.password = 123
4.3 页面获取参数-页面编写规则
- 通过EL表达数获取参数
- ${name}
- ${password}
- 示例:
4.4 页面传递对象
- Action编写规则
- 页面编写规则
<form action="/demo1/userRegisterAction!register2.action" method="post">
用户名:<input type="text" name="userInfo.username"><br>
密码:<input type="password" name="userInfo.password"> <br>
姓名:<input type="text" name="userInfo.name"><br>
年龄:<input type="text" name="userInfo.age"><br>
<input type="submit">
</center></form>
4.5 传递/获取集合
- Action编写规则
- 页面编写规则
引用标签:
怎么引用标签,可以通过struts核心包的MATA-INF下找到struts-tags.tld
<%@ taglib prefix="s" uri="/struts-tags" %>
例如:
<s:property >获取一个参数/属性的值,这个参数是只有一个值
<s:iterator> 获取集合的值
<!-- 使用标签iterator -->
<s:iterator value="studentList" var="student">
<tr>
<td>
<s:property value="#student.username"/>
</td>
<td>
<s:property value="#student.email"/>
</td>
<td>
<s:property value="#student.password"/>
</td>
</tr>
</s:iterator>
使用<s:iterator> 接收集合,value代表要接收的集合,var代表定义的变量,这个变量代表集合存储的内容。
获取集合中存储对象的具体内容。可以通过<s:property>获取,value 是代表具体的属性值,但是必须要带有#前缀
4.6 传递json
- 导入struts2-json-plugin-2.5.jar包
- <package >配置extends="json-default“
- <result> 配置
- 设置 result 的属性:type="json”
- 添加<param name="root">[1]</param>
- [1]是代表json变量
- Action-访问Servlet Api
访问servlet Api
5.1 得到获取Servlet数据的入口
-
- ctx = ActionContext.getContext();
5.2 得到Session
-
- session = ctx.getSession();
5.3 得到Application
-
- application = ctx.getApplication();
5.4 得到HttpServletRequest
-
- ActionContext.getContext().get(HTTP_REQUEST);
5.5 得到HttpServletResponse
-
- ActionContext.getContext().get(HTTP_RESPONSE);
5.6 得到HttpServletRequest
-
- httpServletRequest = ServletActionContext.getRequest();
5.7 得到HttpServletResponse
-
- response= ServletActionContext.getResponse();
5.8 从action跳转到action
- <result name="OPERATION_OPERATION_LIST_CTRL" type="redirect-action">/operation/operationCtrl!queryAllOperation.action</result>
6.1 自定义类
-
public class Exception1 extends Exception { public Exception1( String msg ) { super( msg ); } }
6.2 异常配置
-
<global-results> <result name="ERROR">/Error.jsp</result> <result name="OK">/Ok.jsp</result> </global-results> <global-exception-mappings> <exception-mapping result="ERROR" exception="first.exceptions.Exception1"/> <exception-mapping result="OK" exception="first.exceptions.Exception2"/> </global-exception-mappings>
6.3 异常显示页面
引用标签:
怎么引用标签,可以通过struts核心包的MATA-INF下找到struts-tags.tld
<%@ taglib prefix="s" uri="/struts-tags" %>
显示页面:
- <s:property value="exception.message"/>
7.1 资源文件
- 在first.resources包下建立Eric_zh_CN.properties文件:
- Hu Ming
7.2 添加国际化资源库
- 在WEB-INF下的classes下建立struts.properties文件:
7.3 页面显示国际化信息
-
<s:form action="GetProductsForUserCtrl"> <s:text name="user.name"/> <s:textfield name="userName"/> <s:submit value="登录"/> </s:form> 或: <s:form action="GetProductsForUserCtrl"> <s:textfield name="userName" key="user.name" /> <s:submit value="登录"/> </s:form>
8.1 上传(页面)
- 页面
-
<form action="uploadCtrl!upload.action" method="post" enctype="multipart/form-data"> 选择文件:<input type="file" name="upload" /><br> <input value="上传" type="submit" /> </form>
8.2 上传(Action)
-
Action public class FileCtrl { private File [M1] upload; private String uploadFileName; private String uploadContentType;[M2] public String upload() throws Exception { InputStream is = new FileInputStream( this.getUpload() ); OutputStream os = new FileOutputStream( "e:\\a.txt" ); while ( true ) { int i = is.read(); if ( -1 == i ) { break; } os.write( i ); } is.close(); os.close(); return "OK"; }
- [M1]普通的java.io.File
- [M2]可以没有这两个属性,但如果有,名字前缀要和上面的属性相同,各自的后缀是固定的,遵守这样的规则,他们就能自动的保存上传的文件的类型和文件名称
8.3 下载(页面)
- 页面
- href="uploadCtrl!execute.action">下载</a>
8.4 下载(Action)
-
Action public class FileCtrl { public[M1] InputStream getThatFile[M2] () throws Exception { return new FileInputStream( "e:\\a.txt" ); } public String execute() throws Exception { return "OK"[M3] ; }
- [M1]一定要是共有的,他要被外界调用
- [M2]这个名字与action的配置中result的名字叫“inputName”的param的值对应。
- [M3]正常返回即可
8.5 下载(配置)
- 配置
-
<action name="uploadCtrl" class="first.FileCtrl"> <result name="OK" type="stream[M1] "> <param name="contentType">application/zip</param> <param name="inputName">thatFile[M2] </param> <param name="contentDisposition">attachment;[M3] filename="struts.gif"</param> <param name="bufferSize[M4] ">4096</param>[M5] </result> </action>
- [M1]下载一定是返回stream类型的
- [M2]与action类中返回InputStream的那个方法的名称对应
- [M3]不加这个就变成在页面打开这个文件了
- [M4]下载的缓冲区大小
- [M5]四个参数一定要配
验证种类:
- validate方法验证
- 验证框架
9.1 validate方法验证
9.1.1 国际化文件
-
- Hu Ming Bi Xu Da Yu 3 Wei
9.1.2 Action类
-
public class User extends ActionSupport { private String userName; private List < String > products = new Vector(); public void validate() { if ( 3 > this.userName.trim().length() ) { this.addFieldError( "userName", this.getText( "user.name.error" ) ); } } ……
9.1.3 配置文件
- 配置文件中一定要有一个叫做input的result,并且当前action可以访问这个result,这是错误信息输送页面
- name="input">/index.jsp</result>
- 如果错误信息输送到数据录入页面,则错误信息会显示在数据错误的输入框的上方
9.1.4 错误信息的显示
-
<s:form action="GetProductsForUserCtrl"> <s:textfield name="userName" key="user.name"/> <s:submit value="登录"/> </s:form>
- 哪项验证失败后,报错信息会自动显示到本哪个入框上方
9.2 验证框架
9.2.1 Action类
- public class User extends ActionSupport { }
9.2.2 验证文件
- 在被验证的Action的class文件目录下
- 类的class文件相同路径下
- 建立一个“类名-validation.xml”文件
- User-validation.xml
9.2.3 文件中的内容
-
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators> <field name="userName"> <field-validator type="requiredstring"> <message key="user.name.error"/> </field-validator> </field> </validators>
9.3 验证规则介绍
9.3.1 非空验证
-
<field name="userName"> <field-validator type="required"> <message>${getText("user.name.error")}</message> </field-validator> </field>
9.3.2 非空字符串验证
-
<field-validator type="requiredstring"> <param name="trim">true</param> <!-- <message key="user.name.error"/> --> <message>${getText("user.name.error")}</message> </field-validator
9.3.3 字符串长度验证
-
<field name="userNameEnsure"> <field-validator type="stringlength"> <param name="minLength">3</param> <param name="maxLength">6</param> <message>${getText("user.name.deng")}</message> </field-validator> </field>
9.3.4 正则表达式验证
-
<field-validator type="regex"> <param name="expression"><![CDATA[.*hello.*]]></param> <message>${getText("user.name.regex")}</message> </field-validator>
9.3.5 整数验证
- 控制整数的大小。
-
<field name="userAge"> <field-validator type="int"> <param name="min">3</param> <param name="max">6</param> <message>${getText("user.name.length")}</message> </field-validator> </field>
9.3.6 表达式验证
- 判断多个字段间的关系是否满足某个表达式,如:密码和密码确认输入的数据是否相同。
-
<field name="userNameEnsure"> <field-validator type="fieldexpression"> <param name="expression"> <![CDATA[userName==userNameEnsure[M1] ]]> </param> <message>${getText("user.name.deng")}</message> </field-validator> </field>
[M1]判断的表达式,直接写入要判断的各个属性
9.3.7 日期验证
-
<field name="birthday"> <field-validator type="date"> <param name="min">06-1-1</param> <param name="max">08-1-1</param> <message>${getText("user.name.length")}</message> </field-validator> </field>
日期格式按当前的locale的方式编写
10. 标签库
10.1 引入标签库
<%@ taglib prefix="s" uri="/struts-tags" %>
10.2 S:if
-
<% int age = 11; request.setAttribute( "age", age ); %> <s:if test="#request.age<10"> 10 </s:if> <s:elseif test="#request.age==10"> 10 </s:elseif> <s:else> 10 </s:else>
10.3 s:iterator
10.3.1 遍历List
-
<% List list = new Vector(); list.add("A"); list.add("B"); list.add("C"); list.add("D"); request.setAttribute("list", list); %> <s:iterator value="#request.list" var="curData" status="status"> value="#status.count" /> - /> - value="curData" /> - /> - value="#status.even" /> - /> - value="#status.last" /> </s:iterator>
10.3.2 s:property value属性值介绍
- #status.count
- #status.odd
- var
- #status.index
- list中的位置
- #status.even
- #status.first
- #status.last
10.3.4遍历Map
-
<% Map map = new Hashtable(); map.put( "a", "1" ); map.put( "b", "2" ); map.put( "c", "3" ); request.setAttribute("map", map); %> <s:iterator value="#request.map" id="curData"> <s:property value="key"/> - <s:property value="value"/><br> </s:iterator>
10.4 数据标签
- 显示一个数据
- ${ user[M1] .userName[M2] }
- [M1]JavaBean
- [M2]JavaBean的变量
10.5 S:action
- 获取某个action。
- <s:action namespace="strutsqs2" name="UserLogin" id="user"></s:action>
- user name: ${ user.userName }.<br>
- Package的名字空间
- name配置的名字
- id保存的变量名称
10.6 checkbox
10.6.1 示例1
-
<% List < String > list = new Vector < String > (); list.add("A"); list.add("B"); list.add("C"); list.add("D"); request.setAttribute("list", list); %> <s:iterator value="#request.list" id="curData" status="status"> <s:checkbox name="idList" fieldValue="%{curData}" label="%{curData}"/> </s:iterator> 直接取curData的值,用%{}
直接取curData的值,用%{}
10.6.2 示例2
-
<% List < User > list2 = new Vector < User > (); User user1 = new User(); user1.setUserName( "Eric" ); user1.setUserPassword( "111" ); list2.add( user1 ); User user2 = new User(); user2.setUserName( "Janet" ); user2.setUserPassword( "222" ); list2.add( user2 ); request.setAttribute("list2", list2); %> <s:iterator value="#request.list2" id="curData" status="status"> <s:checkbox name="idList2" fieldValue="%{#curData.userPassword}" label="%{#curData.userName}"/> </s:iterator> 取curData的成员变量,用%{#...}
10.7 S:checkbox
- 后台
- String [] 来保存checkbox的多个选中项的值,如:上面的:
- String [] idList;
10.8 原始checkbox
10.8.1 页面
-
<s:iterator value="#operation.result" id="curOperation" status="status"> <tr> <td><input type="checkbox"[微软用户1] name="idList" value="${ curOperation.operationId }[微软用户2] "/></td> <td><s:property value="#curOperation.projectId" /></td> <td><s:property value="#curOperation.operationUri" /></td> <td><s:property value="#curOperation.operationName" /></td> </tr> </s:iterator> [微软用户1]使用html的原始checkbox [微软用户2]动态设置value
10.8.2 后台
-
- String [] 来保存checkbox的多个选中项的值,如:上面的:
-
- [] idList;
10.9 S;checkboxlist
10.9.1 页面
-
<% List list = new Vector(); list.add("1"); list.add("2"); list.add("3"); list.add("4"); request.setAttribute("list", list); %> <s:form action="UserLogin!userHobby"> <s:checkboxlist list="#request.list[M1] " name="hobbys[M2] " label="测试"></s:checkboxlist> <s:submit></s:submit> </s:form>
[M1]其中的选项的来源,来自于一个集合或数组。
- [M2]生成的checkbox组的name
10.9.2 Action
-
- String [ ] 类型的同名属性和它对应,如:
-
- String [] hobbys;
10.10 s:textfield
- 添加默认值
-
<% String operationName = request.getParameter( "operationName" ); request.setAttribute[微软用户1] ( "operationName", operationName ); %> <s:form action="operationCtrl!modifyOperation"> <s:textfield name="operationName" label="权限名称" value="%{ #request.operationName }"/> <s:password name="operationPassword" label="密码�"/> <s:submit value="修改用户"/> </s:form> [微软用户1]存到这里
10.11 s:datetimepicker
-
<head>中一定要使用‘<s:head />’,否则控件显示不出来。 <s:datetimepicker value="today[M1] " type="date[M2] " toggleType="explode[M3] " weekStartsOn="1[M4] " name="birthday" label="生日" displayFormat="yyyy-MM-dd[M5] "/> [M1]默认值 [M2]显示方式,有:date和time两种 [M3]日期选择框弹出的动态方式,有plain,wipe,explode,fade四种 [M4]星期的排放方式,从星期几开始 [M5]日期显示格式,注意,月份是大写MM,不要写成小写