⑴ MVC2,MVC3,MVC4和MVC5的不同
MVC2,MVC3,MVC4和MVC5的不同:
1、查看引擎:
視圖引擎負責將HTML代碼從視圖呈現到瀏覽器。
MVC 2僅使用Web窗體視圖引擎( .aspx)作為默認視圖引擎。
MVC3使用剃刀視圖引擎( .c#和的cshtml。vbhtml (用於Visual Basic )和Web窗體視圖引擎( .阿斯佩克斯)。
MVC4還使用剃刀視圖引擎作為默認視圖引擎,具有一些新功能,如條件屬性和「波形斜線」。
2、圖表、網路網格、加密、網路映像、網路郵件控制:
所有這些在MVC2中都不可用。
所有這些都在MVC3和MVC4中提供。
3、合成語法:
Web窗體視圖引擎語法: < % = HTML代碼%>在MVC2中。
(剃刀語法)剃刀視圖引擎語法: @MVC3中的Html代碼。
MVC4具有相同的剃刀視圖引擎語法,但添加了新功能,如條件屬性和「波形斜線」,即URL解析。
4、可用於在視圖和控制器之間共享數據的對象:
模板數據、視圖數據在MVC2中可用。
MVC3中提供了臨時數據、視圖數據、視圖包。
MVC4中提供了臨時數據、視圖數據、視圖包。
>TempData用於當前和後續請求,即當您知道要重定向的下一個視圖時。
>在ViewData中,可以通過字元串作為鍵訪問對象字典。
>在c#4.0中添加了ViewBag,它使用允許動態添加對象屬性的動態功能。我們可以說ViewBag = ViewData +ViewData字典周圍的動態特性。
5、jquery支持:
jquery支持在MVC2中很好。
在MVC3中,jquery支持更好。
MVC4為Jquery (如Jquery Mobile)提供了更好的支持。
6、驗證:
MVC2中有客戶端驗證和非同步控制器。
MVC3中包含不引人注目的Ajax和客戶端驗證、Jquery驗證和JSON綁定支持。
客戶端驗證、Jquery驗證和對MVC4非同步方法的增強支持。
7、項目模板:
MVC3支持由HTML5啟用的項目模板。
MVC4支持移動應用程序的許多新功能,還提供了新的移動項目模板和更新和現代化的默認模板。
8、ASP.NET MVC 5中的新功能:
(1)一個ASP網;
(2)ASP凈身份;
(3)MVC模板中的引導程序;
(4)認證過濾器;
(5)過濾器覆蓋。
⑵ MVC過濾器,怎麼排除某個Action不使用Controller下的過濾器
當ActionInvoker在執行目標Action方法之前,會根據Order和Scope屬性對用於封裝ActionFilter的Filter對象進行排序。
然後根據當前ControllerContext和ActionDescriptro創建一個ActionExecutingContext對象,並將其作為參數依次調用所有ActionFilter的OnActionExecuting方法。
在這之後真正的目標Action方法被執行,ActionInvoker隨後執行後續的篩選操作。具體來說,它根據當前ControllerContext、ActionDescriptro以及Action方法執行過程中拋出的異常創建一個ActionExecutedContext對象。該ActionExecutedContext的Cancel屬性為False,如果Action方法返回一個ActionResult對象,該對象將會作為該ActionExecutedContext的Result屬性。
接下來按照相反的次序依次調用ActionFilter對象的OnActionExecuted方法,執行過程中的ActionFilter可以修改ActionExecutedContext的Result屬性。當整個ActionFilter鏈執行結束之後,ActionExecutedContext的Result屬性返回的ActionResult將會作為對當前請求的響應。右圖基本上反映了連同目標Action在內的整個ActionFilter鏈的執行過程。
⑶ SpringMVC的攔截器和過濾器的區別與聯系
1、首先要明確什麼是攔截器、什麼是過濾器
1.1 什麼是攔截器:
攔截器,在AOP(Aspect-Oriented Programming)中用於在某個方法或欄位被訪問之前,進行攔截然後在之前或之後加入某些操作。攔截是AOP的一種實現策略。
在Webwork的中文文檔的解釋為——攔截器是動態攔截Action調用的對象。它提供了一種機制可以使開發者可以定義在一個action執行的前後執行的代碼,也可以在一個action執行前阻止其執行。同時也是提供了一種可以提取action中可重用的部分的方式。
談到攔截器,還有一個詞大家應該知道——攔截器鏈(Interceptor Chain,在Struts2中稱為攔截器棧 Interceptor Stack)。攔截器鏈就是將攔截器按一定的順序聯結成一條鏈。在訪問被攔截的方法或欄位時,攔截器鏈中的攔截器就會按其之前定義的順序被調用。
1.2. 攔截器的實現原理:
大部分時候,攔截器方法都是通過代理的方式來調用的。Struts2的攔截器實現相對簡單。當請求到達Struts2的ServletDispatcher時,Struts 2會查找配置文件,並根據其配置實例化相對的攔截器對象,然後串成一個列表(list),最後一個一個地調用列表中的攔截器。
1.3 什麼是過濾器
過濾器是一個程序,它先於與之相關的servlet或JSP頁面運行在伺服器上。過濾器可附加到一個或多個servlet或JSP頁面上,並且可以檢查進入這些資源的請求信息。在這之後,過濾器可以作如下的選擇:
①以常規的方式調用資源(即,調用servlet或JSP頁面)。
②利用修改過的請求信息調用資源。
③調用資源,但在發送響應到客戶機前對其進行修改。
④阻止該資源調用,代之以轉到其他的資源,返回一個特定的狀態代碼或生成替換輸出。
1.4 Servlet過濾器的基本原理
在Servlet作為過濾器使用時,它可以對客戶的請求進行處理。處理完成後,它會交給下一個過濾器處理,這樣,客戶的請求在過濾鏈里逐個處理,直到請求發送到目標為止。例如,某網站里有提交「修改的注冊信息」的網頁,當用戶填寫完修改信息並提交後,伺服器在進行處理時需要做兩項工作:判斷客戶端的會話是否有效;對提交的數據進行統一編碼。這兩項工作可以在由兩個過濾器組成的過濾鏈里進行處理。當過濾器處理成功後,把提交的數據發送到最終目標;如果過濾器處理不成功,將把視圖派發到指定的錯誤頁面。
2、攔截器與過濾器的區別 :
1. 攔截器是基於java的反射機制的,而過濾器是基於函數回調。
2. 攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
3. 攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
4. 攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
5. 在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次
攔截器的代碼實現(以struts2為例):
1、在xml文件中如何定義攔截器
<interceptors>
<interceptor name="filterIPInterceptor"
class="com.xxxx.web.FilterIPActionInterceptor" />
<interceptor-stack name="filterIPStack">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="filterIPInterceptor" />
</interceptor-stack>
</interceptors>
2、怎麼遍別寫自定義攔截器
public class FilterIPActionInterceptor extends AbstractInterceptor
{
/** 日誌控制. */
private final Log log = LogFactory.getLog(getClass());
/**
* @see com.opensymphony.xwork2.interceptor.AbstractInterceptor#intercept(com.opensymphony.xwork2.ActionInvocation)
*/
@Override
@SuppressWarnings("unchecked")
public String intercept(ActionInvocation invocation) throws Exception
{
String result = null;
// 獲得當前方法名.
String methodName = invocation.getInvocationContext().getName();
String currIp = null;
try
{
if (invocation.getAction() instanceof PortletAction)
{
PortletAction action = (PortletAction) invocation.getAction();
currIp = action.getRequest().getRemoteAddr();
}
String ip = ApplicationResource.getHotValue("ALLOW_CACHE_IP");
if (StringUtils.isBlank(ip) || StringUtils.isBlank(currIp))
{
log.error("允許刷新的IP不存在或當前請求的IP非法.");
throw new NoAllowIPException();
}
else
{
String[] ips = ip.split(",");
boolean errorIp = true;
for (String s : ips)
{
if (s.equals(currIp))
errorIp = false;
}
// 判斷IP
if (errorIp)
throw new NoAllowIPException();
}
result = invocation.invoke();//調用被攔截的方法
}
catch (Exception e)
{
log.error("異常類名:" + invocation.getAction().getClass());
log.error("異常方法:" + methodName, e);
throw e;
}
return result;
}
}
3、怎麼編寫過濾器
1、在web.xml裡面配置自定義的攔截器
<filter>
<filter-name>Redirect Filter</filter-name>
<filter-class>com.xx.filter.RedirectFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Redirect Filter</filter-name>
<url-pattern>/xx/xx/*</url-pattern>
</filter-mapping>
2、如何編寫自定義的攔截器
public class RedirectFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
// 獲取URL
Long startTime = null;
if (log.isDebugEnabled())
{
startTime = System.currentTimeMillis();
}
HttpServletRequest httpRequest = (HttpServletRequest) request;
String url = httpRequest.getRequestURL().toString();
if (url == null || url.trim().length() == 0) {
return;
}
if (url.indexOf(luceneCreateMapping) != -1
|| url.indexOf(luceneSearchMapping) != -1) {
doFilterForxxx(request, response, url);
} else {
doxxxx(request, response, url);
}
if (log.isDebugEnabled())
{
long endTime = System.currentTimeMillis();
Thread currentThread = Thread.currentThread();
String threadName = currentThread.getName();
log.debug("[" + threadName + "]" + "< "
+ this.getClass().getName() + " " + url + " "
+ (endTime - startTime) + " ms");
}
// 激活下一個Filter
filterChain.doFilter(request, response);
}
}
⑷ .net core中如何在執行action前植入一個webapi過濾器
新建一個MyFilter.cs
public class MyFilter: Attribute,IAuthorizationFilter
實現 OnAuthorization 驗證
public class MyFilter : Attribute,IActionFilter,IOrderedFilter
實現 OnActionExecuted(請求方法後)和專 OnActionExecuting(請求方法前)
Startup.cs中ConfigureServices方法中 注冊屬此MyFilter.cs
services.AddMvc(config => config.Filters.Add(new MyFilter()));
⑸ MVC中設置全局過濾器,當設置了Controller過濾器時,怎麼排除內部的一些action不使用過濾器
吧你過濾器的代碼貼出來
⑹ net webapi 能不能使用mvc的過濾器
這個很有用的,13個擴展點中過濾器占重要的地位。自定義身份驗證、自定義post表單時自動檢測錯誤、自定義發生異常時的自動化處理、等等應用。一定要搞明白的。
⑺ 如何使用mvc實現webapi的增刪改查
1.創建項目:visual C# —> ASP.NET MVC 4 web應用程序 模板—>web api;
2.注冊路由:
路由表中的每一個條目都包含一個路由模板。這個Web API默認的路由模版是"api/{controller}/{id}"。在這個模版中,「api」是一個文字式路徑片段,而{controller}和{id}則是佔位符變數。
當Web API框架接收一個HTTP請求時,它會試圖根據路由表中的一個路由模板來匹配其URI。如果無路由匹配,客戶端會接收到一個404(未找到)錯誤。
3.linq to sql連接資料庫
1.建立資料庫建表
2.在models文件夾裡面新建linq to sql類文件
3.工具->連接到資料庫
4.將要用的表拖入設計區
5.獲取資料庫Getway。"linq to sql class"文件名+Datacontext實例化這個對象,數據表就會映射到一個集合屬性中,personDataDataContext db = new personDataDataContext();
6.增刪改查
增:
public Boolean Post([FromBody]UserInfo userInfo) {
personDataDataContext db = new personDataDataContext();
var s1 = new test2
{
UserName =userInfo.UserName, Id=userInfo.Id, Age=userInfo.Age
};
if (db.test2.SingleOrDefault<test2>(s => s.Id == userInfo.Id) == null)
{
db.test2.InsertOnSubmit(s1);
db.SubmitChanges();
return true;
} else {
return false;
}
}
刪:
public bool Delete(int id)
{
personDataDataContext db = new personDataDataContext();
var deleteperson = db.test2.SingleOrDefault<test2>(s => s.Id == id);
if (deleteperson == null)
{
return false;
} else {
db.test2.DeleteOnSubmit(deleteperson);
db.SubmitChanges();
return true;
}
}
改:
public Boolean Put(int id, [FromBody]UserInfo userInfo)
{
personDataDataContext db = new personDataDataContext();
var editperson = db.test2.SingleOrDefault<test2>(s => s.Id == userInfo.Id);
if (editperson == null)
{
return false;
} else {
editperson.Age = userInfo.Age;
editperson.UserName = userInfo.UserName;
db.SubmitChanges();
return true;
}
查:
public IEnumerable<test2> Get()
{
personDataDataContext db = new personDataDataContext();
var query = from s in db.test2
orderby s.UserName
select s;
return query;
}
// GET api/values/5
public string Get(int id)
{
return "value";
}
這里我新建了一個userinfo類
public class UserInfo { public string UserName { get; set; } public int Id { get; set; } public int Age { get; set; } }
用來接收前端頁面ajax請求中的data數據,s => s.Id == userInfo.Id是lamda表達式創建委託方法意思是在db.test2的person集合中查找某個person的Id與userinfo接收到的id相等的person對象
⑻ spring mvc 框架中攔截web請求是通過什麼技術
可以是基於url
基於URL
也可以是基於Spring boot
1.攔截器介紹
Web開發中,可以用Filter(過濾器)和 HandlerInterceptor(攔截器) 來過濾web請求,都能對客戶端發來的請求進行處理。
過濾器:是一個伺服器端的組件,它可以截取用戶端的請求和響應信息,並對這些信息過濾。
Spring MVC 中的攔截器(Interceptor)類似於 Servlet 開發中的過濾器 Filter,它主要用於攔截用戶請求並作相應的處理,它也是 AOP 編程思想的體現,底層通過動態代理模式完成。聽說:只有經過DispatcherServlet 的請求,才會走攔截器鏈,我們自定義的Servlet 請求是不會被攔截的
參考 Spring:過濾器filter、攔截器interceptor、和AOP的區別與聯系
原理
Filter:過濾器是基於函數回調。
HandlerInterceptor:攔截器是基於java的反射機制,使用代理模式
作用域不同
Filter:過濾器依賴於servlet容器,只能在 servlet容器,web環境下使用。跟Spring沒有關系
HandlerInterceptor:攔截器依賴於spring容器,可以在spring容器中調用,不管此時Spring處於什麼環境
過濾內容
Filter:過濾器可以對幾乎所有的請求起作用(可以保護資源)
HandlerInterceptor:攔截器只能對action起作用
細粒度的不同
Filter:過濾器的控制比較粗,只能在請求進來時進行處理,對請求和響應進行包裝
HandlerInterceptor:攔截器提供更精細的控制,可以在controller對請求處理之前或之後被調用,也可以在渲染視圖呈現給用戶之後,以及request全部結束之後,都可以攔截到
中斷
Filter:過濾器比較復雜,需要處理請求和響應對象來引發中斷,需要額外的動作,比如將用戶重定向到錯誤頁面
HandlerInterceptor:不能通過攔截器修改request內容,但是可以通過拋出異常或者preHandle方法內返回 false 進行中斷來暫停request執行
小結
如果過濾器和攔截器同時存在:執行順序:過濾前-攔截前-Action處理-攔截後-過濾後
替代:過濾器能做的,攔截器基本上都能做
————————————————
原文鏈接:https://blog.csdn.net/dreamstar613/article/details/106746128
⑼ c#mvc過濾器有哪幾種,應用場景是什麼
mvc裡面的model通常稱為viewmodel 顧名思義用來與view做交互的 三層里的model通常與資料庫欄位保持一版致 在三層里用來與資料庫和業務層權做交互 兩者都是實體類 DAL操作資料庫封裝成一個model 向上傳遞至BLL 然後在mvc中將model轉換為viewmodel供vi
⑽ SpringMVC中,如果想對所有表單提交的數據進行過濾/轉義,怎麼操作比較簡單
最好的辦法就是整個過濾器,然後獲取表單信息存入資料庫