1//导包 2//配置WEB.XML 3 <filter> 4 <filter-name>struts2</filter-name> 5 <filter-class>org.apache.struts2.dispatcher.ng.filter 6 .StrutsPrepareAndExecuteFilter</filter-class> 7 </filter> 8 9 <filter-mapping> 10 <filter-name>struts2</filter-name> 11 <url-pattern>/*</url-pattern> */ 12 </filter-mapping> 13//加入struts.xml到src下 14 <struts> 15 //配置扩展名 16 <constant name="struts.action.extension" value="do"></constant> 17 //package:struts2使用package来组织模块 18 //name属性:必须,用于其他的包引用当前包,一定要与项目名一致 19 //extends:继承,可以继承所有的配置,通常继承struts-default 20 //namespace:可选,若定义了,必须把namespace加进url 21 //http://localhost:8080/contextPath/namespace/actionName.action 22 <package name="helloWorld" extends="struts-default"> 23 <action name="product-input"> 24 <result>/WEB-INF/pages/input.jsp</result> 25 </action> 26 //class是实体类,默认值是:com.opensymphony.xwork2.ActionSupport, 27 //method为调用的方法,默认值execute() ,返回值为SUCCESS 28 //result返回结果 29 <action name="product-save" class="com.gmy.entiy.Product" method="save"> 30 //type是类型 dispatcher转发 redirect重定向 redirectAction重定向到一个 31 //Action chain转发到一个Action 默认值是dispatcher 32 <result name="details" type="dispatcher">/WEB-INF/pages/details.jsp</result> 33 //重定向到Action 34 <result name="index" type="redirectAction"> 35 <param name="actionName">testAction</param> 36 <param name="namespace">/gmy</param> 37 </result> 38 //redirect重定向可以 但是chain转发不可以 通过这种方式 39 <result name="index" type="redirect">/gmy/testAction.do</result> 40 </action> 41 </package> 42 <package name="helloWorld" extends="struts-default" namespace="/gmy"> 43 <action name="testAction"> 44 <result>/WEB-INF/pages/input.jsp</result> 45 </action> 46 </package> 47 </struts> 48 49 50 51//表单页面 52 //input中的name属性一定要和实体类中的变量对应 53 <form action="product-save.action" method="post"> 54 ProductId:<input type="text" name="productName"> 55 <br><br> 56 ProductDesc:<input type="text" name="productDesc"> 57 <br><br> 58 ProductPrice:<input type="text" name="productPrice"> 59 <br><br> 60 <input type="submit" value="提交"> 61 </form> 62//实体类‘ 63 public class Product { 64 private Integer productId;//变量一定要和name属性对应 65 private String productName; 66 private String productDesc; 67 private double productPrice; 68 //geter、seter方法 69 //必须要一个空参数构造器,供反射用 70 } 71 72//Servlet API解耦方式 73 //ActionContext 74 //上下文对象 75 ActionContext context = ActionContext.getContext(); 76 //application 77 Map<String, Object> application = context.getApplication(); 78 application.put("applicationString", "applicationString"); 79 //session 80 Map<String, Object> session = context.getSession(); 81 session.put("sessionString", "sessionString"); 82 //request 83 Map<String, Object> request = (Map<String, Object>) context.get("request"); 84 request.put("requestString", "requestString"); 85 //parameters取不到值 86 //parameters只能读不能写 87 Map<String, Object> parameters = context.getParameters(); 88 parameters.put("parametersString", "parametersString"); 89 System.out.println(((String[])parameters.get("name"))[0]); 90 System.out.println(((String[])parameters.get("sex"))[0]); 91 92 //实现XXXAware接口 93 private Map<String, Object> application; 94 private Map<String, Object> session; 95 private Map<String, String[]> parameters; 96 private Map<String, Object> request; 97 98 public String tests(){ 99 application.put("applicationString", "application1"); 100 session.put("sessionString", "session"); 101 //不能设值 102 parameters.put("parametersString", new String[]{"gmy1","gmy2"}); 103 request.put("requestString", "request"); 104 System.out.println(((String[])parameters.get("name"))[0]); 105 return "success"; 106 } 107 @Override 108 public void setApplication(Map<String, Object> application) { 109 this.application = application; 110 } 111 @Override 112 public void setParameters(Map<String, String[]> parameters) { 113 this.parameters = parameters; 114 } 115 @Override 116 public void setRequest(Map<String, Object> request) { 117 this.request = request; 118 } 119 @Override 120 public void setSession(Map<String, Object> session) { 121 this.session = session; 122 } 123 124//Servlet API耦合方式 125 //使用ServletAcionContext 126 HttpServletRequest request = ServletActionContext.getRequest(); 127 HttpSession session = request.getSession(); 128 ServletContext servletContext = ServletActionContext.getServletContext(); 129 130 //实现ServletXXXAware接口 131 private HttpServletResponse response; 132 private ServletContext context; 133 private HttpServletRequest request; 134 public String tests(){ 135 return "success"; 136 } 137 @Override 138 public void setServletResponse(HttpServletResponse response) { 139 this.response = response; 140 } 141 @Override 142 public void setServletContext(ServletContext context) { 143 this.context = context; 144 } 145 @Override 146 public void setServletRequest(HttpServletRequest request) { 147 this.request = request; 148 } 149 150//值栈 151 //${}取得是值栈中的内容,并不是request中的 152 //两个逻辑部分 153 //Map栈:实际上是OgnlContext类型,是个Map,也是ActionContext的引用, 154 //里面保存各种Map:requestMap,sessionMap,applicationMap,parametersMap,attr 155 //读取:可以使${requestScope.对象.属性},也可以通过<s:property 156 //value="#request.对象.属性"> 157 //对象栈:实际上是CompoundRoot类型,是一个使用ArrayList定义的栈, 158 //里边保存各种和当前Action示例相关的对象,是一个数据结构意义的栈 159 //读取:可以用${name},也可以用<s:property value="[0].name">从栈里面第几个开始读 160 161//调用public类的静态字段默认是true例如<s:property value="@java.lang.Math@PI">, 162//调用public静态方法默认是false,必须配置<s:property value="@java.lang.Math@cos(0)"> 163//使用对象栈方法为属性赋值<s:property value="调用seter方法"> 164 165//异常 166 <global-results> 167 <result name="input"></result> 168 </global-results> 169 <global-exception-mappings> 170 <exception-mapping result="input" exception="java.lang.ArithmeticException"> 171 </exception-mapping> 172 </global-exception-mappings> 173 174//对于Map栈,打印request,session,application,parameters的某个属性值或某个请求参数 175 <s:property value="#session.date"> 176 <s:property value="#parameters.date[0]"> 177 178//创建一个URL字符串 179 <s:url value"/getProduct" var="url"> 180 <s:param name="productId" value="2002"></s:param> 181 </s:url> 182 183 //取值栈中的属性,对于value值自动ognl解析,若不进行,用单引号 184 <s:url value"/getProduct" var="url"> 185 <s:param name="productId" value="productId"></s:param> 186 </s:url> 187 188//set标签:在request,session,application,page域加入属性值 189<s:set name="productName" value="productName" scope="request"></s:set> 190productName:${requestScope.productName} 191 192//push标签:把对象在标签开始后压入到值栈中,在标签结束时,弹出值栈 193 <s:push value="#request.person"> 194 ${name}//这里取值有效 195 </s:push> 196 ${name}//这里取值无效 197 198//if,else标签,可以直接是使用值栈中的属性 199 <s:if test="productPrice > 1000"> 200 I7处理器 201 </s:if> 202 <s:elseif test="productPrice >800"> 203 I5处理器 204 </s:elseif> 205 <s:else> 206 I3处理器 207 </s:else> 208 209//iterator标签:遍历集合,把集合的每个元素放到栈顶 210 <s:iterator value="#request.person"> 211 ${name}-${age}//取得到 212 </s:iterator> 213 ${name}-${age}//取不到 214 215//sort标签:可以对集合元素进行排序 216 <s:srot comparator="#request.comparator" source="persons" var="persons2"></s:sort> 217 218//date标签:可以对Date对象进行排版 219 <s:date name="#session.date" format="yyyy-MM-dd hh:mm:ss" var="date2"/> 220 date:${date2} 221 222//a:标签:用%{}都属性进行强制ognl解析 223 <s:a href="getPerson.action?name=%{name}">${}</s:a> 224 225//表单标签:可以自动回显 226 <s:form action="save"> 227 <s:hidden name=""></s:hidden> 228 <s:textfield name="userName" label="UserName"></s:textfield> 229 <s:password name="password" label="Password"></s:password> 230 <s:textarea name="desc" label="Desc"></s:textarea> 231 <s:submit></s:submit> 232 </s:form> 233 234//checkbox标签: 235 <s:checkbox name="married" label="Married"></s:checkbox> 236 237//radio标签:使用#{}创建Map 238 <s:radio name="gender" list="#{'1':'Male','0':'Female'}" label="Gender"></s:radio> 239 240//checkboxlist标签: 241 <s:checkboxlist list="#request.cities" listKey="cityId" listValue="cityName" 242 label="City" name="city"></s:checkboxlist> 243 244//select标签:使用{}创建LIST 245 <s:select list="{11,12,13,14,15,16,17,18,19,20}" headerKey="" headerValue="请选择" 246 label="Age" name="age"> 247 <s:optgroup label="21-30" list="#{21:21}"></s:optgroup> 248 <s:optgroup label="31-40" list="#{31:31}"></s:optgroup> 249 </s:select> 250 251//theme属性 252 //可以在标签中增加theme属性 253 //在request.setAttribute("theme","simple"); 254 //可以改成全局的在struts.xml 默认是xhtml <constant name="struts.ui.theme" 255 value="simple"></constant> 256 257 258//例 259 //加入Jar包 260 //配置web.xml 261 <filter> 262 <filter-name>struts2</filter-name> 263 <filter-class>org.apache.struts2.dispatcher.ng.filter 264 .StrutsPrepareAndExecuteFilter</filter-class> 265 </filter> 266 267 <filter-mapping> 268 <filter-name>struts2</filter-name> 269 <url-pattern>/*</url-pattern>*/ 270 </filter-mapping> 271 //配置struts.xml 272 <struts> 273 //配置扩展名 274 <constant name="struts.action.extension" value="do,"></constant> 275 <package name="s2-5" extends="struts-default"> 276 //自定义拦截器栈 277 <interceptors> 278 <interceptor-stack name="gmy"> 279 <interceptor-ref name="paramsPrepareParamsStack"> 280 <param name="prepare.alwaysInvokePrepare">false</param> 281 </interceptor-ref> 282 </interceptor-stack> 283 </interceptors> 284 285 <default-interceptor-ref name="gmy"/> 286 287 <action name="emp-*" class="com.gmy.app.EmployeeAction" method="{1}"> 288 <result name="{1}">emp-{1}.jsp</result> 289 <result type="redirectAction">emp-list</result> 290 </action> 291 </package> 292 </struts> 293 294 //EmployeeAction 295 public class EmployeeAction implements RequestAware,ModelDriven<Employee>, 296 Preparable{ 297 private Dao dao = new Dao(); 298 private Employee emp; 299 public String update(){ 300 dao.update(emp); 301 return "success"; 302 } 303 public void prepareUpdate(){ 304 emp = new Employee(); 305 } 306 public String edit(){ 307 return "edit"; 308 } 309 public void prepareEdit(){ 310 emp = dao.get(empId); 311 } 312 public String save(){ 313 dao.save(emp); 314 return "success"; 315 } 316 public void prepareSave(){ 317 emp = new Employee(); 318 } 319 public String delete(){ 320 dao.delete(empId); 321 return "success"; 322 } 323 public String list(){ 324 arg0.put("emps", dao.getEmployees()); 325 return "list"; 326 } 327 private Integer empId; 328 public void setEmpId(Integer empId) { 329 this.empId = empId; 330 } 331 private Map<String, Object> arg0; 332 @Override 333 public void setRequest(Map<String, Object> arg0) { 334 this.arg0 = arg0; 335 } 336 @Override 337 public Employee getModel() { 338 if(empId == null) 339 emp = new Employee(); 340 else 341 emp = dao.get(empId); 342 return emp; 343 } 344 @Override 345 public void prepare() throws Exception { 346 System.out.println("prepare..."); 347 } 348 } 349 350 //Dao 351 public class Dao { 352 private static Map<Integer, Employee> emps = 353 new LinkedHashMap<Integer, Employee>(); 354 static{ 355 emps.put(1001, new Employee(1001, "AA", "AA", "AA@gmy.com")); 356 emps.put(1002, new Employee(1002, "BB", "BB", "BB@gmy.com")); 357 emps.put(1003, new Employee(1003, "CC", "CC", "CC@gmy.com")); 358 emps.put(1004, new Employee(1004, "DD", "DD", "DD@gmy.com")); 359 emps.put(1005, new Employee(1005, "DD", "DD", "DD@gmy.com")); 360 emps.put(1006, new Employee(1006, "EE", "EE", "EE@gmy.com")); 361 emps.put(1007, new Employee(1007, "FF", "FF", "FF@gmy.com")); 362 emps.put(1008, new Employee(1008, "GG", "GG", "GG@gmy.com")); 363 emps.put(1009, new Employee(1009, "HH", "HH", "HH@gmy.com")); 364 emps.put(10010, new Employee(10010, "II", "II", "II@gmy.com")); 365 } 366 public List<Employee> getEmployees(){ 367 return new ArrayList<Employee>(emps.values()); 368 } 369 public void delete(Integer empId){ 370 emps.remove(empId); 371 } 372 public void save(Employee emp){ 373 emp.setEmpId((int)System.currentTimeMillis()); 374 emps.put(emp.getEmpId(), emp); 375 } 376 public Employee get(Integer empId){ 377 return emps.get(empId); 378 } 379 public void update(Employee emp){ 380 emps.put(emp.getEmpId(), emp); 381 } 382 } 383 384 //Employee 385 public class Employee { 386 private Integer empId; 387 private String firstName; 388 private String lastName; 389 private String email; 390 public Integer getEmpId() { 391 return empId; 392 } 393 public void setEmpId(Integer empId) { 394 this.empId = empId; 395 } 396 public String getFirstName() { 397 return firstName; 398 } 399 public void setFirstName(String firstName) { 400 this.firstName = firstName; 401 } 402 public String getLastName() { 403 return lastName; 404 } 405 public void setLastName(String lastName) { 406 this.lastName = lastName; 407 } 408 public String getEmail() { 409 return email; 410 } 411 public void setEmail(String email) { 412 this.email = email; 413 } 414 public Employee(Integer empId, String firstName, String lastName, 415 String email) { 416 super(); 417 this.empId = empId; 418 this.firstName = firstName; 419 this.lastName = lastName; 420 this.email = email; 421 } 422 public Employee() { 423 // TODO Auto-generated constructor stub 424 } 425 } 426 427 //index.jsp 428 <body> 429 <a href="emp-list.do">Emp List</a> 430 </body> 431 432 //emp-list.jsp 433 <body> 434 <!-- 435 private Integer empId; 436 private String firstName; 437 private String lastName; 438 private String email; 439 --> 440 <s:debug></s:debug> 441 <s:form action="emp-save.do"> 442 <s:textfield name="firstName" label="FirstName"></s:textfield> 443 <s:textfield name="lastName" label="LastName"></s:textfield> 444 <s:textfield name="email" label="Email"></s:textfield> 445 <s:submit></s:submit> 446 </s:form> 447 <br><br> 448 <table cellpadding="10" cellspacing="0" border="1"> 449 <thead> 450 <tr> 451 <td>ID</td> 452 <td>FirstName</td> 453 <td>LastName</td> 454 <td>Email</td> 455 <td>Edit</td> 456 <td>Delete</td> 457 </tr> 458 </thead> 459 <tbody> 460 <s:iterator value="#request.emps"> 461 <tr> 462 <td>${empId}</td> 463 <td>${firstName}</td> 464 <td>${lastName}</td> 465 <td>${email}</td> 466 <td><a href="emp-edit.do?empId=${ empId}">Edit</a></td> 467 <td><a href="emp-delete.do?empId=${ empId}">Delete</a></td> 468 </tr> 469 </s:iterator> 470 </tbody> 471 </table> 472 </body> 473 474 //emp-edit.jsp 475 <body> 476 <s:form action="emp-update.do"> 477 <s:hidden name="empId" ></s:hidden> 478 <s:textfield name="firstName" label="FirstName"></s:textfield> 479 <s:textfield name="lastName" label="LastName"></s:textfield> 480 <s:textfield name="email" label="Email"></s:textfield> 481 <s:submit></s:submit> 482 </s:form> 483 </body> 484 485//错误消息显示 486 //1、继承ActionSupport 487 //2、配置<result name="input">标签 488 //3、在Action所在包内创建properties文件,例如UserAction.java,UserAction 489 //.properties,UserAction.properties增加内容invalid.fieldvalue.age=... 490 //可以通过debug标签看值栈中的属性 ,${fieldErrors.age[0]} 491 //也可以通过标签<s:fielderror filedName="age"></s:fielderror> 492 //提出ul li span,在src下,新建template.simple包,在新建fielderror.ftl文件 493 <#if fieldErrors??><#t/> 494 <#assign eKeys = fieldErrors.keySet()><#t/> 495 <#assign eKeysSize = eKeys.size()><#t/> 496 <#assign doneStartUlTag=false><#t/> 497 <#assign doneEndUlTag=false><#t/> 498 <#assign haveMatchedErrorField=false><#t/> 499 <#if (fieldErrorFieldNames?size > 0) ><#t/> 500 <#list fieldErrorFieldNames as fieldErrorFieldName><#t/> 501 <#list eKeys as eKey><#t/> 502 <#if (eKey = fieldErrorFieldName)><#t/> 503 <#assign haveMatchedErrorField=true><#t/> 504 <#assign eValue = fieldErrors[fieldErrorFieldName]><#t/> 505 <#if (haveMatchedErrorField && (!doneStartUlTag))><#t/> 506 <#assign doneStartUlTag=true><#t/> 507 </#if><#t/> 508 <#list eValue as eEachValue><#t/> 509 <#if parameters.escape>${eEachValue!?html}<#else>${eEachValue!}</#if> 510 </#list><#t/> 511 </#if><#t/> 512 </#list><#t/> 513 </#list><#t/> 514 <#if (haveMatchedErrorField && (!doneEndUlTag))><#t/> 515 <#assign doneEndUlTag=true><#t/> 516 </#if><#t/> 517 <#else><#t/> 518 <#if (eKeysSize > 0)><#t/> 519 <#list eKeys as eKey><#t/> 520 <#assign eValue = fieldErrors[eKey]><#t/> 521 <#list eValue as eEachValue><#t/> 522 <#if parameters.escape>${eEachValue!?html} 523 <#else>${eEachValue!}</#if> 524 </#list><#t/> 525 </#list><#t/> 526 </#if><#t/> 527 </#if><#t/> 528 </#if><#t/> 529 530//自定义转换器 531 532 533 534//国际化 535 //在struts.xml文件中加入<constant name="struts.custom.i18n.resources" 536 // value="i18n"></constant> 537 //在src下新建i18n_en_US.properties和i18n_zh_CN.properties文件 538 //在标签中不使用label标签,而使用key标签,label中要使用的必须label="%{getText('submit')}" 539 540//通过超链接来切换语言 541 <a href="testI18n.action?request_locale=en_US">English</a> 542 <a href="testI18n.action?request_locale=zh_CN">中文</a> 543 544//验证文件 545 //1、将struts-2.3.20\apps\struts2-blank\WEB-INF\classes\example下 546 //的Login-validation.xml复制到Action所在包下 547 //把Login的名字改为当前Action的名字 548 <field name="age"> 549 <field-validator type="int"> 550 <param name="min">20</param> 551 <param name="max">50</param> 552 <message key="">..${min}.${max}...</message>//也是使用国际化 553 </field-validator> 554 </field>
Struts
Easter79
2021-10-12
1239 0 0
点赞
收藏
评论区
加载中...