導航:首頁 > 凈水問答 > struts過濾serverlet

struts過濾serverlet

發布時間:2021-02-10 14:21:38

Ⅰ servlet可以被strutsprepareandexecutefilter攔截嗎

這個就抄牽扯到struts2的底層源碼了襲
StrutsPrepareAndExecuteFilte 實現了Filter介面
伺服器啟動調用StrutsPrepareAndExecuteFilte .init()初始化來初始化幾個重要的類,比如Dispatcher

當前台有請求發來,StrutsPrepareAndExecuteFilte 的doFilter()被調用
進行request等的封裝,找到相應action,執行相應action

struts的攔截器很重要,配置在struts-deafault.xml里有很多攔截器
比如說吧: <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
這個攔截器就是自動根據前台來的request來封裝action屬性的攔截器

Ⅱ 用了struts2還能用普通的servlet嗎

這是必然的啊...
struts2的filter必須抄映射成/*..
能不能用servlet我也沒試...
http://..com/question/77895495.html
我的struts2問題..
沒人回答..
郁悶了 ...

IMPORTANT: this filter must be mapped to all requests. Unless you know exactly what you are doing, always map to this URL pattern: /*
這是struts2 DOC文檔里的FilterDispatcher的第一句話..請認真閱讀文檔!

Ⅲ 如何讓struts2和servlet的共存

解決方法目前有四種:
方法1:
統一在後面加上.servlet結尾(包括web.xml配置文件中和頁面上使用servlet的地方)

方法2:
在struts.xml中的<struts>的節點下面添加struts2處理的請求後綴 常量:
<!--
該屬性指定需要Struts 2處理的請求後綴,該屬性的默認值是action,即所有匹配*.action的請求都由Struts 2處理。
如果用戶需要指定多個請求後綴,則多個後綴之間以英文逗號(,)隔開。
-->
<constant name="struts.action.extension" value="action" />

方法3:
在web.xml中修改struts2攔截頁面請求的配置:
原:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

現:

<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/user/*</url-pattern>
</filter-mapping>
servlet的請求路徑不必改變

方法4:
自定義filter對servlet進行過濾
##############################################
# 該類是定義了一個過濾器(隨便你放在某個包下面),當既用到struts2又用到servlet時,
# 必須用該過濾器對所有的servlet做一次過濾,否則servlet將無法正常運行。
# 同時在web.xml中,在定義struts的核心控制器的過濾器前面添加該過濾器,添加代碼如下:
* <filter>
* <filter-name>redisp</filter-name>
* <filter-class>filters.ReDispatcherFilter(該過濾器的類名)</filter-class>
* <init-param>
* <param-name>includeServlets</param-name>
* <param-value>所配置的servlet,注意是那url-pattern</param-value>
* </init-param>
* </filter>
* <filter-mapping>
* <filter-name>redisp</filter-name>
* <url-pattern>/*</url-pattern>
* </filter-mapping>
*該類也可以直接繼承StrutsPrepareAndExecuteFilter的
###########################################################
public class ReDispatcherFilter implements Filter {

public void destroy() {
// TODO Auto-generated method stub
}

public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException
{

HttpServletRequest request = (HttpServletRequest)req;
String target = request.getRequestURI();
target = target.lastIndexOf("?")>0
?target.substring(target.lastIndexOf("/")+1,target.lastIndexOf("?")-target.lastIndexOf("/"))
:target.substring(target.lastIndexOf("/")+1);
System.out.println(target);
if(this.includes.contains(target))
{
RequestDispatcher rdsp = request.getRequestDispatcher(target);
System.out.println("go..............."+rdsp);
rdsp.forward(req, resp);
}
else
chain.doFilter(req, resp);
}
private ArrayList<String> includes = new ArrayList<String>();

public void init(FilterConfig config) throws ServletException {
this.includes.addAll( Arrays.asList(config.getInitParameter("includeServlets").split(",")));
}

}

Ⅳ struts2攔截了servlet的請求 求大神解決

<url-pattern>*.action</url-pattern> 是過濾的制url 關鍵部位 (結尾)

http://..com/question/481754705.html 這樣 的
你是 481754705.html 這樣, 過濾器過濾 question481754705.html 結尾
所以 你的過濾器在你所請求中永遠不生效 (說白了就是少了個 /)

Ⅳ 什麼是serverlet,filter,listener

對一類 url,或所有 url 進行業務處理 對各種 url 之類進行匹配,查找,執行相應操作,與 action 相比較而言,action 只能針對 某一特定的 url 進行匹配,進行操作 如: <form action = "update.action"> action 對應的 url 是固定的,對於 struts1.x 可能一個 action 只有一個 url 對於 struts2.0,一個 action 可能有多個 url,看它實現的方法數量,不過這些 url 在提交 之前都是已經的,固定的。而上面四種可以對任意 url 進行操作,如 <url-pattern>*.action</url-pattern> 區別:1,servlet 流程是短的,url 傳來之後,就對其進行處理,之後返回或轉向到某一自 己指定的頁面。它主要用來在 業務處理之前進行控制. 2,filter 流程是線性的, url 傳來之後,檢查之後,可保持原來的流程繼續向下執行, 被下一個 filter, servlet 接收等,而 servlet 處理之後,不會繼續向下傳遞。filter 功能可用來保持流程繼續按照原來的方式進行下去,或者主導流程,而 servlet 的功能主要用 來主導流程。 filter 可用來進行字元編碼的過濾,檢測用戶是否登陸的過濾,禁止頁面緩存等 3, servlet,filter 都是針對 url 之類的, listener 是針對對象的操作的, session 而 如 的創建,session.setAttribute 的發生,在這樣的事件發生時做一些事情。 可用來進行:Spring 整合 Struts,為 Struts 的 action 注入屬性,web 應用定時任 務的實現,在線人數的統計等 4,interceptor 攔截器,類似於 filter,不過在 struts.xml 中配置,不是在 web.xml, 並且不是針對 URL 的,而是針對 action,當頁面提交 action 時,進行過濾操作,相當於 struts1.x 提供的 plug-in 機制,可以看作,前者是 struts1.x 自帶的 filter,而 interceptor 是 struts2 提供的 filter. 與 filter 不同點:(1)不在 web.xml 中配置,而是在 struts.xml 中完成配置,與 action 在一起 ( 2 interceptor 來在接收之前做事 一,servlet 1, 在 web.xml 中配置 Servlet <servlet> <servlet-name>AutoServlet</servlet-name> <servlet-class> com.servlet.AutoServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>AutoServlet</servlet-name> <url-pattern>/AutoServlet</url-pattern> </servlet-mapping> 2,定義 AutoServlet,繼承 HttpServlet,實現方法 doGet, doPost ) 可由 action 自己指定用哪個 3, 應用: (1)Struts1.x 就是一個 Servlet, 它會在 doGet 方法中讀取配置文件 struts-config.xml 進行 action 的匹配,進行 (2)驗證碼生成(也可用 action 來做) 業務處理 二,filter 1, web.xml 配置 <filter> <filter-name>checkUrl</filter-name> <filter-class>com.lvjian.filter.CheckUrl</filter-class> <init-param> <param-name>name</param-name> <param-value>asong</param-value> //初始化傳參,得到時在 filter 的 init 方法中用 filterConfig.getInitParameter( "name" ) </init-param> </filter> <filter-mapping> <filter-name>checkUrl</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 2, 繼承 javax.servlet.Filter,實現 doFilter(HttpServletRequest request, HttpServletResponse response FilterChain filterChain) 等方法 HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; //獲取用戶請求的 URI String request_uri = request.getRequestURI(); //獲取 web 應用程序的上下文路徑 String contextPath = request.getContextPath(); //去除上下文路徑,得到剩餘部分的路徑 String uri = request_uri.substring(contextPath.length()); //創建會話 session HttpSession session = request.getSession(true); //保持原有流程不變 filterChain.doFilter( servletRequest , servletResponse ); 3,應用:(1)Struts2.0 (2) 進行字元編碼的過濾,檢測用戶是否登陸的過濾等 (3)禁止頁面緩存,原理就是對各個請求的 url 令其為空,在 doFilter 加入: request.setCharacterEncoding("GB2312");//設置編碼 ((HttpServletResponse)response).setHeader("Pragma" ,"No-cache"); ((HttpServletResponse)response).setHeader("Cache-C ontrol","no-cache"); ((HttpServletResponse)response).setHeader("Expires ","0");//禁止緩存 三,listener 1, 在 web.xml 中配置 <listener> <listener-class>demo.listener.MyContextLoader</listener-class> </listener> //這樣伺服器就會在啟動時創建 MyContextLoader 的一個實例,並開始監聽 servlet,session 的操作 2, 實現 常用的 listener 有: (1) ServletContextListener 監聽 ServletContext。 當創建 ServletContext 時,激 發 contextInitialized(ServletContextEvent sce)方法; 當銷毀 ServletContext 時, 激發 contextDestroyed(ServletContextEvent sce)方法。 (2) 監聽對 ServletContext 屬性的操作,比 如增加、刪除、修改屬性。 (3)HttpSessionListener 監聽 HttpSession 的操作。 當創建一個 Session 時,激發 session Created(HttpSessionEvent se) 方法; 當銷毀一個 Session 時, 激發 sessionDestroyed (HttpSessionEvent se) 方法。 (4)HttpSessionAttributeListener 監聽 HttpSession 中的屬性的操作。 當在 Session 增加一個屬性時,激 發 attributeAdded(HttpSessionBindingEvent se) 方法; 當在 Session 刪除一個屬性時,激發 attributeRemoved(HttpSessionBindingEventse)方法; 當在 Session 屬性被重新設置時,激發 attributeReplaced(HttpSessionBindingEvent se) 方法。 四,interceptor 1, 在 struts.xml 中配置 創建一個 strus.xml 的子配置文件 struts-l99-default.xml,它繼承與 struts2 的 struts-default,此配置文件是其他子配置文件的父類,只要是繼承與該文件的配置文件所 聲明的路徑都會被它過濾 . 方法 1. 普通配置法 <struts> <package name="struts2" extends="struts-default"> <interceptors> <interceptor name="myInterceptor" class="e.hust.interceptor.MyInterceptor"></interceptor> </interceptors> <action name="register" class="e.hust.action.RegisterAction"> <result name="input">/register.jsp</result> <result>/result.jsp</result> <!-- 在自定義 interceptor 並將其 ref 時, 系統會覆蓋掉默認的 interceptor-stack(defaultStack), 為了保證系統默認的 defaultStack 不受影 響, 我們需要顯式的將其引入 --> <!-- 注意兩個 interceptor-ref 的順序, 順序不同, 執行效果也不同: 先配置的先 執行/後配置的先退出(先進後出) --> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="myInterceptor"></interceptor-ref> </action> </package> </struts> 方法 2. 配置攔截器棧(即將多個 interceptor 串聯的一種元素)。然後在<action>中引入 該攔截器棧就可以了。 執行順序為先配置的先執行 這樣做的原因是:多個 action 有相同的多個 interceptor 時,如一般自己寫一個,系統 默認的有一個,要注入兩個, 對多個 action 都寫這兩個,不利於修改,可以寫成一個鏈,只需引用此鏈即可。 (1)攔截目標對象(被代理對象),這里目標對象就是 action;(2)攔截器(一個類,動態的將 某些方法插入到目標對象的某方法的 before、after);(3)對目標對象生成的(動態)代理對 象(代理對象內部方法綜合了目標對象方法+攔截器方法)。程序最終執行的是目標對象的代理, 而這個代理已經插入了 interceptor。攔截器作用:攔截 action。interceptor 相當於一 個入口和出口, 通過 interceptor 進入 action, 執行完 action 的代碼再通過 interceptor 出去。針對"struts2 -- interceptor(Interceptor 怎麼寫)"這篇文章的 MyInterceptor.class 和 MyInterceptor2.class。根據下面的配置文件執行程 序 <struts> <package name="struts2" extends="struts-default"> <struts> <package name="struts2" extends="struts-default"> <interceptors> <interceptor name="myInterceptor" class="e.hust.interceptor.MyInterceptor"></interceptor> <interceptor-stack name="myInterceptorStack"> <interceptor-ref name="myInterceptor"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <action name="register" class="e.hust.action.RegisterAction"> <result name="input">/register.jsp</result> <result>/result.jsp</result> <interceptor-ref name="myInterceptorStack"></interceptor-ref> </action> </package> </struts> 方法 3. 修改默認攔截器,將自定義的攔截器棧定義為 struts2 的默認攔截器。 <struts> <package name="struts2" extends="struts-default"> <interceptors> <interceptor name="myInterceptor" class="e.hust.interceptor.MyInterceptor"></interceptor> <interceptor-stack name="myInterceptorStack"> <interceptor-ref name="myInterceptor"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 此默認 interceptor 是針對當前包內所有 action 的,若不為 action 顯式指定 interceptor,就會用 default-interceptor-ref--> <!-- 如果某個 action 中引入了 interceptor, 則在這個 action 中此默認 interceptor 就會失效 --> <default-interceptor-ref name="myInterceptorStack"></default-interceptor-ref> <action name="register" class="e.hust.action.RegisterAction"> <result name="input">/register.jsp</result> <result>/result.jsp</result> </action> </package> </struts> 3. extends MethodFilterInterceptor 的攔截器如何配置哪些方法該攔截、哪些方法不 該攔截(針對方法攔截的配置) <struts> <package name="struts2" extends="struts-default"> <interceptors> <interceptor name="myInterceptor3" class="e.hust.interceptor.MyInterceptor3"></interceptor> </interceptors> <action name="register" class="e.hust.action.RegisterAction" method="queryAll"> <result name="input">/register.jsp</result> <result>/result.jsp</result> <!-- myInterceptor3 攔截器只對 RegisterAction 中的 queryAll()方法和 insert()方法進行了攔截, 其他方法未進行攔截 --> <interceptor-ref name="myInterceptor3"> <param name="includeMethods">queryAll, execute</param> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </action> <action name="register" class="e.hust.action.RegisterAction" method="insert"> <result <span 2, 實現 interceptor 類似於 filter, 自定義 filter 是實現 javax.servlet.Filter 來完成, 而 interceptor 類似,它通過實現 com.opensymphony.xwork2.interceptor.Interceptor 來自定義實現。 該介面提供了三個方法: 1) void init(); 在該攔截器被初始化之後,在該攔截器執行攔截之前,系統回調該 方法。對於每個攔截器而言,此方法只執行一次。 2) void destroy();該方法跟 init()方法對應。在攔截器實例被銷毀之前,系統將 回調該方法。 3) String intercept(ActionInvocation invocation) throws Exception; 該方法是用戶需要實現的攔截動作。該方法會返回一個字元串作為邏輯視圖。 除此之外,繼承類 com.opensymphony.xwork2.interceptor.AbstractInterceptor 是更簡單的一種實現攔截器類的方式,因為此類提供了 init()和 destroy()方法的空實現, 這樣我們只需要實現 intercept 方法。 3, 應用 import java.util.Map; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; /** * 許可權檢查攔截器 * * @author qiujy * @version 1.0 */ public class AuthorizationInterceptor extends AbstractInterceptor { /* * 攔截 Action 處理的攔截方法 * */ public String intercept(ActionInvocation invocation) throws Exception { //清除後台頁面的緩存 HttpServletResponse response = ServletActionContext.getResponse(); // ServletActionContext 自動提供,可讓其獲得 request,session,response 等 response.setHeader("Pragma","No-cache"); response.setHeader("Cache-Control","no-cache"); response.setHeader("Expires","0"); Map session = invocation.getInvocationContext().getSession(); String userName = (String) session.get("userName"); if (null != userName && userName.equals("test")) { System.out.println("攔截器:合法用戶登錄---"); return invocation.invoke(); //保持原來的流程不改變 } else { System.out.println("攔截器:用戶未登錄---"); return Action.LOGIN; //返回到配置文件中名字為 login 的 action } } }

Ⅵ jsp/servlet過濾器和struts2攔截器的有什麼區別

攔截器和過濾器的區別:

1、攔截器是基於java的反射機制的,而過濾器是基於函數回調

2、過濾器依賴與servlet容器,而攔截器不依賴與servlet容器

3、攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用

4、攔截器可以訪問action上下文、值棧里的對象,而過濾器不能

5、在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次

攔截器
:是在面向切面編程的就是在你的service或者一個方法前調用一個方法,或者在方法後調用一個方法比如動態代理就是攔截器的簡單實現,在你調用方法前列印出字元串(或者做其它業務邏輯的操作),也可以在你調用方法後列印出字元串,甚至在你拋出異常的時候做業務邏輯的操作。

下面通過實例來看一下過濾器和攔截器的區別:

使用攔截器進行/admin 目錄下jsp頁面的過濾

[html] view plain

<package name="newsDemo"
extends="struts-default"

namespace="/admin">

<interceptors>

<interceptor name="auth"
class="com.test.news.util.AccessInterceptor" />

<interceptor-stack name="authStack">

<interceptor-ref
name="auth" />

</interceptor-stack>

</interceptors>

<!-- action -->

<action name="newsAdminView!*" class="newsAction"

method="{1}">

<interceptor-ref
name="defaultStack"/>

<interceptor-ref
name="authStack">

</interceptor-ref>

下面是我實現的Interceptor class:

[java] view plain

package com.test.news.util;

import java.util.Map;

import com.opensymphony.xwork2.ActionContext;

import
com.opensymphony.xwork2.ActionInvocation;

import
com.opensymphony.xwork2.interceptor.AbstractInterceptor;

import
com.test.news.action.AdminLoginAction;

/**

*
@author chaoyin

*/

public class AccessInterceptor
extends AbstractInterceptor {

private static final long
serialVersionUID = -4291195782860785705L;

@Override

public String intercept(ActionInvocation actionInvocation) throws
Exception {

ActionContext actionContext =
actionInvocation.getInvocationContext();

Map session =
actionContext.getSession();

//except login action

Object action = actionInvocation.getAction();

if (action
instanceof AdminLoginAction) {

return
actionInvocation.invoke();

}

//check
session

if(session.get("user")==null ){

return
"logout";

}

return actionInvocation.invoke();//go
on

}

}

過濾器:是在javaweb中,你傳入的request,response提前過濾掉一些信息,或者提前設置一些參數,然後再傳入servlet或者struts的
action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者
struts的action前統一設置字元集,或者去除掉一些非法字元。

使用過濾器進行/admin
目錄下jsp頁面的過濾,首先在web.xml進行過濾器配置:

[html] view plain

<filter>

<filter-name>access
filter</filter-name>

<filter-class>

com.test.news.util.AccessFilter

</filter-class>

</filter>

<filter-mapping>

<filter-name>access filter</filter-name>

<url-pattern>/admin/*</url-pattern>

</filter-mapping>

下面是過濾的實現類:

[java] view
plain

package com.test.news.util;

import
java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import
javax.servlet.FilterConfig;

import
javax.servlet.ServletException;

import
javax.servlet.ServletRequest;

import
javax.servlet.ServletResponse;

import
javax.servlet.http.HttpServletRequest;

import
javax.servlet.http.HttpServletResponse;

import
javax.servlet.http.HttpSession;

public class AccessFilter
implements Filter {

/**

* @author chaoyin

*/

public void destroy() {

}

public void doFilter(ServletRequest arg0, ServletResponse arg1,

FilterChain filterChain) throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest)arg0;

HttpServletResponse response = (HttpServletResponse)arg1;

HttpSession session = request.getSession();

if(session.getAttribute("user")== null &&
request.getRequestURI()。indexOf("login.jsp")==-1 ){

response.sendRedirect("login.jsp");

return ;

}

filterChain.doFilter(arg0, arg1);

}

public void init(FilterConfig arg0) throws ServletException {

}

}
摘自網路--

Ⅶ struts2是filter還是servlet

filter也是servlet,struts2也是通過servlet實現的,如果你能自己寫一個一個structs,你會發現,你寫的就是servlet

Ⅷ STruts2過濾器怎麼攔截所有!save方法

寫一個servlet :UserFilter 實現Filter 介面
重寫方法:public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain){
if(session.getAttribut("user")==null) 異常處理;內
filterChain.doFilter(request, response);
}

修改web.xml增加servlet配置:容
<servlet>
<servlet-name>UserFilter</servlet-name>
<servlet-class>****UserFilter</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserFilter</servlet-name>
<url-pattern>*</url-pattern>
</servlet-mapping-->

Ⅸ Struts與serverlet的不同

Servlet: JavaEE規范
1)sun公司提供的JavaEE規范,主要用於開發web應用;
2)簡單的說:servlet就是一個使用了一定協議以及Api的java程序;
專業的說:servlet是一套開發web應用的規范,其內部實現全部由java語言實現,具有java語言的一切優點。開發的過程是用java開發java應用。換句話說就是使用一些已經寫好的java程序去實現一定的業務,即也就是結合業務調用對象以及方法的過程;
3)servlet的主要實現都位於:javax.servlet.*以及javax.servlet.http.*兩個包下;
4)CGI的替代品;
5)一個可以處理多用戶請求的程序,處理方式:同一份代碼,用線程來控制請求處理;servlet api明確說明servlet不是線程安全的,原因是所有的請求處理都是在一個Servlet裡面完成的。

Struts: 最早的MVC開源框架
1)是apache組織基於MVC模式開發的開源的單點控制的web應用框架(framework);
2)struts2的核心是WebWork2,繼承了webwork2的血統,所以跟struts1.x有很大的區別,更類似於WebWork;
3)struts2是一個基於MVC Model 2的單點控制的Web應用框架;

一個是規范,一個是框架,區別大著呢!

Ⅹ struts2 是過濾器還是servlet

<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>

看名字

閱讀全文

與struts過濾serverlet相關的資料

熱點內容
edi評測費用 瀏覽:775
廢水管不停響 瀏覽:827
土壤陽離子交換能力最強的離子是 瀏覽:708
樹脂桶結構圖 瀏覽:589
喜牌飲水機多少價格 瀏覽:77
凈水機廢水管口能抬高多少 瀏覽:729
用於廢水分離工藝的主要包括用於過濾 瀏覽:818
小巨人空氣凈化器效果怎麼樣 瀏覽:459
安全除垢劑 瀏覽:11
養水草用什麼純水機 瀏覽:678
洛恩斯凈水器濾芯怎麼換 瀏覽:677
污水處理優秀員工事跡材料 瀏覽:293
飲水機活性炭怎麼樣 瀏覽:619
屠宰廢水污泥含量是多少 瀏覽:682
健康天使空氣凈化器怎麼樣 瀏覽:927
景區污水處理後怎麼辦 瀏覽:198
清洗反滲透膜方案 瀏覽:860
潔星力除垢劑主要成分 瀏覽:721
高壓鍋燒水水垢 瀏覽:329
小紅門污水處理廠人員 瀏覽:331