日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Struts2基础知识

發布時間:2024/7/23 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Struts2基础知识 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文主要包括以下內容

  • struts2常用常量的定義與意義
  • struts2處理流程
  • 拆分struts
  • 動態方法調用,使用通配符
  • 接收請求參數
  • 中文編碼問題
  • 自定義類型轉化器
  • 訪問或添加request/session/application
  • 常用servlet對象的獲取
  • struts2常用常量的定義與意義

    struts2處理流程

    每一次請求都會創建一個新的action,所以struts2的action是線程安全的

    拆分struts

    動態方法調用

    (不建議使用)動態方法調用:http://localhost:8080/struts2day02/customer/addCustomer!updateCustomer(應該執行addCustomer,使用!updateCustomer,在請求addCustomer就執行了updateCustomer)
    關閉動態調用的功能:

    struts.enable.DynamicMethodInvocation = false

    使用通配符

    <package name="orders" namespace="/orders" extends="mypackage"><action name="orders_*" class="cn.itcast.action.OrdersAction" method="{1}"><result type="dispatcher" name="success">/orders/success.jsp</result></action></package>

    接收請求參數

    采用基本類型接收請求參數(get/post)

    在Action類中定義與請求參數同名的屬性,struts2便能自動接收請求參數并賦予給同名屬性。
    請求路徑http://localhost:8080/test/view.action?id=100

    public class ProductAction{ private Integer id; public void setId(Integer id){//struts2通過反射技術調用與請求參數同名的屬性的settter方法來獲取請求參數值 this.id = id; } public Integer getId(){return id;} }

    采用復合類型接收請求參數

    請求路徑:http://localhost:8080/test/view.action?product.id=78

    public class ProductAction{ private Product product; public void setProduct(Product product){this.product = product;} public Product getProduct(){return product;} }

    struts2首先通過反射技術調用Product的默認構造函數創建product對象,然后再通過反射技術調用product中與請求參數同名的屬性的setter方法來獲取請求參數值

    中文亂碼問題

    過濾器實現

    package com.zj.filter;import java.io.IOException; import java.util.Map;import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper;public class EncodeFilter implements Filter {private FilterConfig config=null;private ServletContext context=null;private String encode=null;@Overridepublic void destroy() {// TODO 自動生成的方法存根}@Overridepublic void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException {// TODO 自動生成的方法存根//響應亂碼解決arg1.setCharacterEncoding(encode);arg1.setContentType("text/html;charset="+encode);//請求亂碼解決arg2.doFilter(new MyHttpServletRequest((HttpServletRequest) arg0), arg1);}@Overridepublic void init(FilterConfig arg0) throws ServletException {// TODO 自動生成的方法存根this.config=arg0;this.context=arg0.getServletContext();this.encode=context.getInitParameter("encode");}private class MyHttpServletRequest extends HttpServletRequestWrapper{private HttpServletRequest request=null;private boolean isNotEncode=true;public MyHttpServletRequest(HttpServletRequest request) {super(request);// TODO 自動生成的構造函數存根this.request=request;}@Overridepublic String getParameter(String name) {// TODO 自動生成的方法存根return getParameterValues(name)==null?null:getParameterValues(name)[0];}@Overridepublic Map<String, String[]> getParameterMap() {// TODO 自動生成的方法存根try{if(request.getMethod().equalsIgnoreCase("post")){request.setCharacterEncoding(encode);return request.getParameterMap();}else if(request.getMethod().equalsIgnoreCase("GET")){Map<String,String[]> map=request.getParameterMap();if(isNotEncode){for(Map.Entry<String, String[]> entry:map.entrySet()){String []vs=entry.getValue();for(int i=0;i<vs.length;i++){vs[i]=new String(vs[i].getBytes("iso8859-1"),encode);}}isNotEncode=false;}return map;}else{return request.getParameterMap();}//return super.getParameterMap();}catch(Exception e){e.printStackTrace();throw new RuntimeException();}}@Overridepublic String[] getParameterValues(String name) {// TODO 自動生成的方法存根return getParameterMap().get(name);}}}

    web.xml中注冊

    <!-- 過濾器配置開始 --><filter><description>全站亂碼過濾器</description><filter-name>EncodeFilter</filter-name><filter-class>com.zj.filter.EncodeFilter</filter-class></filter><filter-mapping><filter-name>EncodeFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

    解決亂碼的另一方法

    <!-- 全站參數配置 --><context-param><description>全站編碼配置</description><param-name>encode</param-name><param-value>utf-8</param-value></context-param>

    自定義類型轉化器,解決輸入Date類型的問題

    1、編寫一個類,繼承
    com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter

    2、覆蓋掉其中的convertValue方法

    public Object convertValue(Map<String, Object> context, Object value,Class toType)context:OGNL表達式的上下文value:實際的值。用戶輸入的都是字符串,但他是一個String數組。toType:目標類型public class DateConvertor extends DefaultTypeConverter {/*context:ognl表達式的上下文value:用戶輸入的值( 保存數據時)或者模型中的屬性。用戶輸入的值是String數組toType:目標類型*/@Overridepublic Object convertValue(Map<String, Object> context, Object value,Class toType) {DateFormat df = new SimpleDateFormat("yyyy/MM/dd");if(toType==Date.class){//2013/05/31----->java.util.Date 保存數據時String strValue = ((String[])value)[0];try {return df.parse(strValue);} catch (ParseException e) {throw new RuntimeException(e);}}else{//java.util.Date----->2013/05/31 獲取數據時Date dValue = (Date)value;return df.format(dValue);}}}

    3、注冊類型轉換器
    3.1局部類型轉換器:只對當前的Action有效

    具體做法:在動作類相同的包中,建立一個名稱是“動作類名-conversion.properties”的配置文件, 文件中增加以下內容:要驗證的字段=驗證器的類全名 birthday=cn.itcast.convertor.DateConvertor

    3.2全局類型轉換器:對所有的Action都有效

    具體做法:在WEB-INF/classes目錄下,建立一個名稱為"xwork-conversion.properties"的配置文件, 文件中增加以下內容:目標類型全名=驗證器的類全名 java.util.Date=cn.itcast.convertor.DateConvertor

    注意:如果轉換失敗,Struts2框架會尋找name=input的結果頁面

    訪問或添加request/session/application

    /*** */ package cn.itcast.action;import java.io.Serializable; import java.util.Map;import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport;/*** @author wzhting**/ //域范圍 public class ScopeAction extends ActionSupport implements Serializable {//向各大域范圍存放點數據@Overridepublic String execute() throws Exception {ActionContext ac = ActionContext.getContext();Map<String,Object> applicationMap = ac.getApplication();//這個就是ServletContext對象中維護的那個MapapplicationMap.put("p", "application_p");// ServletContext.setAttribute(key,object);Map<String,Object> sessionMap = ac.getSession();//這個就是HttpSession對象中維護的那個MapsessionMap.put("p", "session_p");// HttpSession.setAttribute(key,object);ac.put("p", "request_p");//相當于ServletRequest.setAttribute(key,obj); return super.execute();}}

    在jsp中可以得到

    applicationScope生存周期是整個應用
    sessionScope生存周期是整個會話
    requestScope生存周期是一次請求

    <body>應用范圍:${applicationScope.p}<br/> 會話范圍:${sessionScope.p}<br/>請求范圍:${requestScope.p}<br/></body>

    ### 常用servlet對象的獲取

    ### 方式一:通過ServletActionContext直接獲取

    //方式一public String execute1(){ServletContext sc = ServletActionContext.getServletContext();System.out.println(sc);ServletRequest request = ServletActionContext.getRequest();System.out.println(request);return SUCCESS;}

    ### 方式二:實現指定接口,由struts框架運行時注入

    public class WebObjectAction extends ActionSupport implements Serializable,ServletContextAware,ServletRequestAware,ServletResponseAware {private ServletContext context;private HttpServletRequest request;private HttpServletResponse response;//方式二public String execute2(){System.out.println(context);System.out.println(request);System.out.println(response);return SUCCESS;}public void setServletContext(ServletContext context) {//如果動作類實現了ServletContextAware接口,就會自動調用該方法this.context = context;}public void setServletRequest(HttpServletRequest request) {this.request = request;}public void setServletResponse(HttpServletResponse response) {this.response = response;}}

    完成

    總結

    以上是生活随笔為你收集整理的Struts2基础知识的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。