struts2的session獲取支持兩種方式,httpSession、SessionMapjavascript
導包:css
<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>3.0-alpha-1</version> </dependency>
一:使用的是sessionMap對象----不推薦html
Map<String, Object> session = ActionContext.getContext().getSession(); session.put("usernameS", username);
二:使用httpSession方式----不推薦前端
HttpSession session = ServletActionContext.getRequest().getSession(); session.setAttribute("usernameS", username);
三:實現sessionaware接口,並實現其中的setsession方法---推薦java
爲了便於其它action共同使用同一個變量session(全局session),咱們須要將session抽取成基類,其它action若是使用,則繼承此基類便可 /** * Action基類,便於其它action使用全局session對象信息 * @author likang * @date 2018-1-10 上午8:56:57 */ public class BaseAction implements SessionAware{ public Map<String, Object> session; /** * 此getter方法,是變量session的getter方法 * @return */ public Map<String, Object> getSession() { return session; } /** * 是接口SessionAware中的接口方法,並不是session的setter方法 */ public void setSession(Map<String, Object> session) { this.session = session; } }
public class BaseAction implements SessionAware{ public Map<String, Object> session; public Map<String, Object> getSession() { return session; } public void setSession(Map<String, Object> session) { this.session = session; } }
1:接收請求,而且將請求進行過濾 2:進行轉發到struts.xml進行處理 filter控制器,是須要配置到web.xml中 而且默認的請求後綴名是action和空 若是想修改請求後綴名,則須要在struts.xml中增長以下屬性信息: <constant name="struts.action.extension" value="do"/> 若是是容許多個請求後綴,則須要用逗號隔開 (須要進行數據攔截) (會將請求的數據和響應的數據封裝到值棧中)
package須要繼承struts-default 默認的action是:com.opensymphony.xwork2.ActionSupport 其中有默認的方法:execute 默認的返回值:success
1:應用於界面響應的 dispatcher redirect 2:應用於action響應的 chain redirectAction 3:應用於字節流的響應 stream 4:應用於json的響應 json---(須要引用struts-json.jar包)
需求:jquery
在登陸頁面,增長驗證碼(圖片)信息
請求:web
login.jsp-->/image.do--->action---->login.jsp
開發步驟:ajax
1:修改login.jsp文件,增長驗證碼信息 2:配置一個image.do的action信息(struts.xml) 3:添加一個ImageAction.java文件,execute--生成一張驗證碼圖片
login.jsp:apache
驗證碼:<input id="code" name="code" type="text"><img src="image.do"></img><br/>
ImageAction.java:json
/** * 生成驗證碼圖片 * @author likang * @date 2018-1-10 上午10:16:26 */ @Controller public class ImageAction { public InputStream image; public String execute(){ try { BufferedImage bi = new BufferedImage(100, 50, BufferedImage.TYPE_INT_RGB);//表明建立一個畫布或者像素空間 Graphics graphics = bi.getGraphics();//建立畫筆 graphics.setColor(Color.RED);//設置圖片前景顏色 graphics.drawString("java13", 0, 50);//畫信息 ByteArrayOutputStream bout = new ByteArrayOutputStream(); ImageIO.write(bi, "png", bout);//將圖片信息,添加到outputstream中 byte[] by = bout.toByteArray();//j a v a 1 3 image = new ByteArrayInputStream(by);//將字節流轉換成字符流 return "success"; } catch (Exception e) { } return "error"; } public InputStream getImage() { return image; } public void setImage(InputStream image) { this.image = image; } }
struts.xml:
<!-- 生成驗證碼圖片 --> <action name="image" class="imageAction" method="execute"> <result name="success" type="stream"> <param name="inputName">image</param> </result> </action>
//經過工具類來生成驗證碼 ValidateCode vc = new ValidateCode(200, 50, 2, 1); image = vc.getInputStream();
流程:
1:CheckCodeAction.java須要去判斷輸入的驗證碼和系統生成的驗證碼是否一致 2:系統生成的驗證碼須要在image.do的時候,就須要獲取到code字符值
開發步驟:
1:導包: <!-- json數據類型 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-json-plugin</artifactId> <version>2.5.13</version> </dependency> 2:修改struts.xml中的package中extends屬性爲json-default <package name="user" extends="json-default" namespace="/user"> 3:增長驗證碼校驗接口struts.xml <!-- 驗證碼校驗 --> <action name="checkCode" class="checkCodeAction" method="execute"> <result name="success" type="json"><!-- 來源於struts-json包中的xml文件 --> <param name="root">rc</param><!-- root表明json實現類中的參數變量,負責接收json數據 --> </result> </action> 4:增長一個返回值的實體信息,封裝成json格式數據 /** * 返回的實體對象信息---json格式 * @author likang * @date 2018-1-10 上午11:31:31 */ public class ReturnContans implements Serializable{ private int status; private String msg; private Object data; public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } } 5:增長CheckCodeAction /** * 驗證碼校驗 * @author likang * @date 2018-1-10 上午11:27:36 */ @Controller public class CheckCodeAction extends BaseAction{ public String code;//接收用戶輸入的驗證碼信息 ReturnContans rc = new ReturnContans(); public String execute(){ String Scode = session.get("Scode").toString();//獲取系統生成的驗證碼 if (StringUtils.isNotBlank(code) && StringUtils.isNotBlank(Scode)) { if (code.equalsIgnoreCase(Scode)) { rc.setStatus(0);//0:表明驗證碼正確 rc.setMsg("驗證碼輸入正確"); // return "";//驗證碼輸入正確 }else{ rc.setStatus(1);//1:表明驗證碼錯誤 rc.setMsg("驗證碼輸入錯誤"); } } return "success";//驗證碼輸入錯誤\驗證碼輸入正確 } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public ReturnContans getRc() { return rc; } public void setRc(ReturnContans rc) { this.rc = rc; } } 6:在系統驗證碼生成的時候,須要將驗證碼存放於session中,便於使用校驗 ImageAction.java: session.put("Scode", vc.getCode()); 7:編寫login.jsp文件,增長js校驗,發送ajax請求 <script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery.min.js"></script> <script type="text/javascript"> $(function(){ $("#code").blur(function(){ var code = $("#code").val().trim(); if (code == "") { $("#Vcode").html("不能爲空"); $(":submit").attr("disabled","disabled"); }else{ $.ajax({ url:"${pageContext.request.contextPath }/user/checkCode.do", type:"post", dataType:"json", data:{"code":code}, success:function(result){ if (result.status == 1) { $("#Vcode").html("驗證碼錯誤"); $(":submit").attr("disabled","disabled"); }else{ $("#Vcode").html("驗證碼正確"); $(":submit").removeAttr("disabled"); } } }) } }); }); </script> 驗證碼:<input id="code" name="code" type="text"><img src="image.do"></img><span id="Vcode"></span>
struts2提供大量的攔截器,有一個默認的攔截器棧defaultStack
攔截器可使用作爲登陸檢測、性能檢測、權限檢測等等
攔截器棧:interceptor-stack
裏面封裝了須要執行的攔截器
需求:
/list.do----變動:若是用戶沒有登陸,則不能訪問,直接跳轉登陸頁面
開發步驟:
1:自定義一個攔截器,實現Interceptor,並實現其中的intercept方法 /** * 自定義攔截器---攔截用戶是否登陸 * @author likang * @date 2018-1-10 下午2:40:10 */ public class DemoInterceptor implements Interceptor{ @Override public void destroy() { // TODO Auto-generated method stub } @Override public void init() { // TODO Auto-generated method stub } /** * 若是返回值爲noLogin,則表明用戶沒有登陸,此時須要跳轉toLogin.do接口 * 若是usernameS不爲空,則返回NULL,或者返回invocation.invoke(),表明是繼續執行下一步攔截 */ @Override public String intercept(ActionInvocation invocation) throws Exception { //檢測用戶是否登陸 Map<String, Object> session = ActionContext.getContext().getSession(); if (session != null) { if (session.get("usernameS") != null && !"".equals(session.get("usernameS"))) { }else{ return "noLogin";//-result-----toLogin.do } } return invocation.invoke(); } } 2:在struts.xml中,增長攔截器設置指定 <package> <interceptors> <interceptor name="noLoginInterceptor" class="com.xdl.util.DemoInterceptor"></interceptor> </interceptors> </package> 3:在須要攔截的action中,指定攔截器指向ref,和result組件返回值 <interceptor-ref name="noLoginInterceptor"></interceptor-ref> <result name = "noLogin" type="redirectAction"> <param name="namespace">/user</param> <param name="actionName">toLogin</param> </result> 4:爲了更方便擴展和應用,將攔截器設置進行提取 <package name="demo-default" extends="struts-default"> <interceptors> <interceptor name="noLoginInterceptor" class="com.xdl.util.DemoInterceptor"></interceptor> </interceptors> <global-results> <result name = "noLogin" type="redirectAction"> <param name="namespace">/user</param> <param name="actionName">toLogin</param> </result> </global-results> </package> 5:在須要攔截的action中,進行指定,前提須要package繼承demo-default <default-interceptor-ref name="noLoginInterceptor"></default-interceptor-ref>
前端文件如:css/js/jsp/html等等
1:導包
<!-- 註解包 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-convention-plugin</artifactId> <version>2.5.13</version> </dependency>
2:註解
對應到action類上面: @Namespace(value="/demo") @ParentPackage(value="demo-default") 對應到action中的方法上面: @Action(value="hello",results={ @Result(name="success",location="/WEB-INF/jsp/hello.jsp") })
修改struts.xml:
<package name="demo-default" extends="struts-default"> <interceptors> <interceptor name="noLoginInterceptor" class="com.xdl.util.DemoInterceptor"></interceptor> <interceptor-stack name="demoStack"> <!-- 攔截棧 先走咱們自定義的,再走Struts2默認的攔截器--> <interceptor-ref name="noLoginInterceptor"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <global-results> <result name = "noLogin" type="redirectAction"> <param name="namespace">/user</param> <param name="actionName">toLogin</param> </result> </global-results> </package> <default-interceptor-ref name="demoStack"></default-interceptor-ref>
前端界面調試以及數據展現:
須要在前端頁面增長S標籤: <%@ taglib uri="/struts-tags" prefix="s" %> <s:debug></s:debug>
Object-Graph Navigation Language
引入ognl-3.1.15.jar 包
對象導航圖語言
public class TestStack { @Test public void test1(){ Dept dept = new Dept(); // dept.setDeptName("nihao"); // System.out.println(dept.getDeptName()); setPreperties(dept, "deptName", "nihao"); System.out.println(dept.getDeptName()); } public void setPreperties(Object entity,String name,String value){ try { Ognl.setValue(name, entity, value); } catch (OgnlException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Test public void test2() throws OgnlException{ Dept dept = new Dept(); dept.setDeptName("nihaoa"); System.out.println("數據初始化:"+dept.getDeptName()); String deptname = (String) Ognl.getValue("deptName", dept); System.out.println("經過OGNL獲取數據值:"+deptname); Map<String, Object> context = new HashMap<String, Object>(); context.put("deptName", "nihao-----123123"); String deptnameS = (String) Ognl.getValue("#deptName", context, dept); System.out.println("ognl經過表達式獲取值:"+deptnameS); } }