Strtus2框架笔记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Strtus2框架笔记相关的知识,希望对你有一定的参考价值。
Struts2以WebWork优秀的设计思想为核心,吸收了 Struts框架的部分优点,提供了一个更加整洁的MVC设计模式实现的Web 应用程序框架。 Struts2引入了几个新的框架特性:从逻辑中分离出横切关注点的拦截器、减少或者消除配置文件、贯穿整个框架的强大表达式语言、支持可变更和可重用的基于MVC模式的标签API, Struts2充分利用了从其它MVC框架学到的经验和教训,使得 Struts2框架更加清晰灵活。
Struts2的详细交教程可以看:http://www.yiibai.com/struts_2/
为什么要用Struts2:
struts2其实就是为我们封装了servlet,简化了jsp跳转的复杂操作,并且提供了易于编写的标签,可以快速开发view层的代码。
过去,我们用jsp和servlet搭配,实现展现时,大体的过程是:
1 jsp触发action
2 servlet接受action,交给后台class处理
3 后台class跳转到其他的jsp,实现数据展现
现在有了struts2,实现过程变为
1 jsp触发action
2 struts2拦截请求,调用后台action
3 action返回结果,由不同的jsp展现数据
Struts2的优势:
Struts2有两方面的技术优势,一是所有的Struts2应用程序都是基于client/server HTTP交换协议,The Java Servlet API揭示了Java Servlet只是Java API的一个很小子集,这样我们可以在业务逻辑部分使用功能强大的Java语言进行程序设计。
二是提供了对MVC的一个清晰的实现,这一实现包含了很多参与对所以请求进行处理的关键组件,如:拦截器、OGNL表达式语言、堆栈。
因为struts2有这样目标,并且有这样的优势,所以,这是我们学习struts2的理由,下面,我们在深入剖析一下struts的工作原理。
Struts2工作原理:
Struts2简单实例:
web.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 3 <display-name>1101Strtus2</display-name> 4 5 <filter> 6 <filter-name>struts2</filter-name> 7 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 8 </filter> 9 10 <filter-mapping> 11 <filter-name>struts2</filter-name> 12 <url-pattern>/*</url-pattern> 13 </filter-mapping> 14 15 </web-app>
struts2配置文件:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 6 <struts> 7 <!-- 开启方法时调用 --> 8 <constant name="struts.enable.DynamicMethodInvocation" value="false" /> 9 <!-- 打开开发模式 --> 10 <constant name="struts.devMode" value="true" /> 11 12 <package name="helloworld" namespace="/helloworld" extends="struts-default"> 13 <action name="test" class="com.hanqi.action.HelloWorldAction"> 14 <result> 15 /page/success.jsp 16 </result> 17 </action> 18 </package> 19 </struts>
<result>标签可以在同一个action中设置多个,根据他的name属性来区分。
java类:
1 package com.hanqi.action; 2 3 import com.opensymphony.xwork2.ActionSupport; 4 5 public class HelloWorldAction extends ActionSupport{ 6 7 @Override 8 public String execute(){ 9 System.out.println("执行execute方法!!!"); 10 return "fail"; 11 } 12 }
主页:
1 <%@ page language="java" contentType="text/html; charset=utf-8" 2 pageEncoding="utf-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 <a href="helloworld/test">跳转</a> 11 </body> 12 </html>
点击链接,就会跳到根据相应的方法找到相应的页面。
Struts2传参数:
1 package com.hanqi.action; 2 3 import java.util.Date; 4 5 import com.alibaba.fastjson.JSONObject; 6 import com.hanqi.model.AppUser; 7 8 public class TestAction2 extends BaseAction { 9 10 private static final long serialVersionUID = 1L; 11 12 private Date dateStr; 13 14 private AppUser appUser; 15 16 private JSONObject jo; 17 18 public String test1() { 19 System.out.println(dateStr); 20 21 return SUCCESS; 22 } 23 24 public String test2() { 25 System.out.println(appUser); 26 27 return SUCCESS; 28 } 29 30 public String doJson() { 31 AppUser user = new AppUser(); 32 user.setId(123); 33 user.setUsername("admin"); 34 user.setPassword("321"); 35 36 JSONObject _jo = new JSONObject(); 37 _jo.put("success", true); 38 _jo.put("result", user); 39 this.setJo(_jo); 40 41 return SUCCESS; 42 } 43 44 public Date getDateStr() { 45 return dateStr; 46 } 47 48 public void setDateStr(Date dateStr) { 49 this.dateStr = dateStr; 50 } 51 52 public AppUser getAppUser() { 53 return appUser; 54 } 55 56 public void setAppUser(AppUser appUser) { 57 this.appUser = appUser; 58 } 59 60 public JSONObject getJo() { 61 return jo; 62 } 63 64 public void setJo(JSONObject jo) { 65 this.jo = jo; 66 } 67 68 69 }
1 package com.hanqi.action; 2 3 import com.hanqi.model.AppUser; 4 import com.opensymphony.xwork2.ModelDriven; 5 6 public class TestAction extends BaseAction implements ModelDriven<AppUser> { 7 8 private static final long serialVersionUID = 1L; 9 10 private String username; 11 12 private AppUser appUser; 13 14 public String testMethod() { 15 System.out.println(username); 16 getRequest().setAttribute("param1", username); 17 18 return SUCCESS; 19 } 20 21 public String testMethod2() { 22 System.out.println(appUser); 23 return SUCCESS; 24 } 25 26 public String getUsername() { 27 return username; 28 } 29 30 public void setUsername(String username) { 31 this.username = username; 32 } 33 34 public AppUser getAppUser() { 35 return appUser; 36 } 37 38 public void setAppUser(AppUser appUser) { 39 this.appUser = appUser; 40 } 41 42 @Override 43 public AppUser getModel() { 44 if (appUser == null) { 45 appUser = new AppUser(); 46 } 47 return appUser; 48 } 49 }
1 package com.hanqi.model; 2 3 import java.util.Date; 4 5 public class AppUser { 6 7 private Integer id; 8 private String username; 9 private String password; 10 private Date birthday; 11 12 public AppUser() { 13 super(); 14 } 15 16 public AppUser(Integer id, String username, String password) { 17 super(); 18 this.id = id; 19 this.username = username; 20 this.password = password; 21 } 22 23 public Integer getId() { 24 return id; 25 } 26 27 public void setId(Integer id) { 28 this.id = id; 29 } 30 31 public String getUsername() { 32 return username; 33 } 34 35 public void setUsername(String username) { 36 this.username = username; 37 } 38 39 public String getPassword() { 40 return password; 41 } 42 43 public void setPassword(String password) { 44 this.password = password; 45 } 46 47 @Override 48 public String toString() { 49 return "AppUser [id=" + id + ", username=" + username + ", password=" + password + ", birthday=" + birthday 50 + "]"; 51 } 52 53 public Date getBirthday() { 54 return birthday; 55 } 56 57 public void setBirthday(Date birthday) { 58 this.birthday = birthday; 59 } 60 61 }
1 package com.hanqi.util; 2 3 import java.text.ParseException; 4 import java.text.SimpleDateFormat; 5 import java.util.Date; 6 import java.util.Map; 7 8 import org.apache.struts2.util.StrutsTypeConverter; 9 10 import com.opensymphony.xwork2.conversion.TypeConversionException; 11 /* 12 * 日期转换类 13 */ 14 public class MyDateConvertor extends StrutsTypeConverter { 15 16 private static final SimpleDateFormat[] sdf = { 17 new SimpleDateFormat("yyyyMMdd"), 18 new SimpleDateFormat("yyyy-MM-dd"), 19 new SimpleDateFormat("yyyy年MM月dd日"), 20 new SimpleDateFormat("yyyy/MM/dd") 21 }; 22 23 @Override 24 public Object convertFromString(Map arg0, String[] values, Class arg2) { 25 26 String dateString = values[0]; 27 Date date = null; 28 for(int i=0;i<sdf.length;i++) { 29 try { 30 date = sdf[i].parse(dateString); 31 return date; 32 } catch (ParseException e) { 33 // e.printStackTrace(); 34 continue; 35 } 36 } 37 throw new TypeConversionException("没有记录的日期类型.."); 38 } 39 40 @Override 41 public String convertToString(Map arg0, Object arg1) { 42 // TODO Auto-generated method stub 43 return null; 44 } 45 46 }
log4j2.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <Configuration> 3 <Appenders> 4 <Console name="STDOUT" target="SYSTEM_OUT"> 5 <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/> 6 </Console> 7 </Appenders> 8 <Loggers> 9 <Logger name="com.opensymphony.xwork2" level="debug"/> 10 <Logger name="org.apache.struts2" level="debug"/> 11 <Root level="warn"> 12 <AppenderRef ref="STDOUT"/> 13 </Root> 14 </Loggers> 15 </Configuration>
struts2.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 6 <struts> 7 <!-- 开启动态方法调用 --> 8 <constant name="struts.enable.DynamicMethodInvocation" value="false" /> 9 <!-- 打开开发模式 --> 10 <constant name="struts.devMode" value="true" /> 11 12 <package name="helloworld" namespace="/helloworld" extends="json-default"> 13 <action name="helloworld" class="com.hanqi.action.HelloWorldAction"> 14 <result name="success">/page/success.jsp</result> 15 <result name="fail">/page/fail.jsp</result> 16 </action> 17 18 <action name="test1" class="com.hanqi.action.TestAction" method="testMethod"> 19 <result>/page/result.jsp</result> 20 </action> 21 22 <action name="test2" class="com.hanqi.action.TestAction" method="testMethod2"> 23 <result>/page/result.jsp</result> 24 </action> 25 26 <action name="test3" class="com.hanqi.action.TestAction2" method="test1"> 27 <result>/page/result.jsp</result> 28 </action> 29 30 <action name="test4" class="com.hanqi.action.TestAction2" method="test2"> 31 <result>/page/result.jsp</result> 32 </action> 33 34 <action name="*_*" class="com.hanqi.action.{1}Action"> 35 <result> 36 /page/{2}.jsp 37 </result> 38 </action> 39 40 <action name="testjson" class="com.hanqi.action.TestAction2" method="doJson"> 41 <result type="json"> 42 <param name="root">jo</param> 43 </result> 44 </action> 45 46 </package> 47 48 </struts>
xwork日期转换
1 java.util.Date=com.hanqi.util.MyDateConvertor
index.xml
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 <script type="text/javascript" src="js/jquery-1.12.3.min.js"></script> 9 <script type="text/javascript"> 10 $(function() { 11 $("#btn").click(function() { 12 $.ajax({ 13 url:"helloworld/testjson.action", 14 type:"post", 15 dataType:"json", 16 success:function(data) { 17 console.log(data); 18 }, 19 error:function() { 20 alert("ERROR !"); 21 } 22 }); 23 }); 24 }); 25 </script> 26 </head> 27 <body> 28 <a href="helloworld/test.action">测试链接</a><br> 29 <a href="helloworld/test1.action?username=admin">测试链接_传递参数</a><br> 30 <form action="helloworld/test1.action" method="post"> 31 <input name="username" /><input type="submit" value="提交" /> 32 </form> 33 <hr> 34 <form action="helloworld/test2.action" method="post"> 35 <input name="username" /><input name="password" /><input type="submit" value="提交" /> 36 </form> 37 <hr> 38 <form action="helloworld/test3.action" method="post"> 39 <input name="dateStr" /><input type="submit" value="提交" /> 40 </form> 41 <hr> 42 <h1>不实现ModelDriven接口传递实体类</h1> 43 <form action="helloworld/test4.action" method="post"> 44 <input name="appUser.id" /> 45 <input name="appUser.username" /> 46 <input name="appUser.password" /> 47 <input name="appUser.birthday" /> 48 <input type="submit" value="提交" /> 49 </form> 50 <a href="helloworld/Login_success">测试链接2</a><button id="btn">测试json</button> 51 </body> 52 </html>
以上是关于Strtus2框架笔记的主要内容,如果未能解决你的问题,请参考以下文章