SpringMVC總結帖

  SpringMVC是基于MVC設計理念的一款優秀的Web框架,是目前最流行的MVC框架之一,SpringMVC通過一套注解,讓POPJ成為處理請求的控制器,而無需實現任何接口,然后使用實現接口的控制器也完全沒問題;支持REST風格的URL請求;采用松散耦合架構,比其他MVC框架更具有靈活性和擴展性。關于SpringMVC工程如何搭建請點擊:Spring學習之第一個Spring MVC程序(IDEA開發環境)。

?

0 XML配置文件

  web.xml配置DispatcherServlet,DispatcherServlet默認會加載/WEB-INF/xxx-servlet.xml的Spring配置信息,啟動Web層的Spring容器。當然,也可以通過配置contextConfigLocation來自定義配置文件名稱和位置,如下所示:

<servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/springmvc-servlet.xml</param-value></init-param><load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>

0.1?xxx-servlet.xml配置

  xxx-servlet.xml中一般配置自動掃描的包信息、HandlerMapping、ViewResolver,如果沒有配置HandlerMapping,則默認使用的是BeanNameURLHandlerMapping;如果沒有配置ViewResolver,則默認使用的InternalResourceViewResolver。

<!-- 配置自定義掃描的包-->
<context:component-scan base-package="com.luoxn28"></context:component-scan><!-- ViewResolver 視圖解析器 如果沒有配置的話,則InternalResourceViewResolver就是默認的 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="order" value="1"/> <!-- ViewResolver優先級 --><!-- 前綴 和 后綴 --><property name="prefix" value="/"/><property name="suffix" value=".jsp"/>
</bean>

?

1 使用@RequestMapping映射請求

  SpringMVC中使用@RequestMapping注解為handler指定可以處理那些URL請求,該注解可以在方法及類定義處使用,DispatcherServlet處理請求時,通過handler的@RequestMapping提供的映射信息確定請求的處理類(或方法)。@RequestMapping在類和方法定義不同之處在于:

  • 類定義處:提供初步的請求映射信息,相對于 WEB 應用的根目錄。
  • 方法處:提供進一步的細分映射信息。,相對于類定義處的 URL,若類定義處未標注@RequestMapping,則方法處標記的 URL 相對于WEB 應用的根目錄。

使用@RequestMapping示例如下所示:

@Controller
@RequestMapping("/test")
public class Test {@RequestMapping("/testperson")public String testUser(Person person) {System.out.println(person);return "index";}
}

1.1?@RequestMapping映射請求頭、請求方法、參數

  @RequestMapping 除了可以使用請求URL映射請求外,還可以使用請求方法、請求參數及請求頭映射請求,這些從@RequestMapping注解源碼也可以看得出來。@RequestMapping 的 value、method、params 及 heads分別表示請求 URL、請求方法、請求參數及請求頭的映射條件,他們之間是與的關系,聯合使用多個條件可讓請求映射更加精確化。

@RequestMapping(value = "/delete", method = RequestMethod.POST, params = "userId")
public String delete() {// ...return "xxx";
}@RequestMapping(value = "/show", headers = "contentType=text/*")
public String show() {// ...return "xxx";
}

1.2?@RequestMapping映射URL綁定的占位符

  帶占位符的URL是Spring3.0之后新增的功能,該功能是SpringMVC向REST風格挺進發展一個重要標志。通過@PathVariable可以將URL中占位符參數綁定到控制器處理方法的入參中:URL 中的 {xxx} 占位符可以通過@PathVariable("xxx") 綁定到操作方法的入參中。

@RequestMapping("/delete/{id}")
public String delete(@PathVariable("id") Integer id) {UserDao.delete(id);return "index";
}

  ps: 關于什么是REST請翻到最后:finally REST部分。

?

2 映射請求參數

  • Spring MVC 通過分析處理方法的簽名,將 HTTP 請求信息綁定到處理方法的相應人參中。
  • Spring MVC 對控制器處理方法簽名的限制是很寬松的,幾乎可以按喜歡的任何方式對方法進行簽名。
  • 必要時可以對方法及方法入參標注相應的注解(@PathVariable、@RequestParam、@RequestHeader 等)、SpringMVC 框架會將 HTTP 請求的信息綁定到相應的方法入參中,并根據方法的返回值類型做出相應的后續處理。

2.1 使用@RequestParam綁定請求參數

  在方法入參出使用@RequestParam把請求參數傳遞到方法中。-value是參數名,-requered是否必須,默認為true,表示如果該請求參數中不存在對應的參數,則拋出異常。

@RequestMapping("/userinfo")
public String getUserInfo(@RequestParam(value = "usrename", required = false) String username,@RequestParam("age") int age) {// ...return "xxx";
}

2.2 使用@RequestHeader綁定請求頭參數

  請求頭包含了若干個屬性,服務器可據此獲知客戶端的信息,通過@RequestHeader即可將請求頭中的屬性值綁定到處理方法的入參中。

@RequestMapping("/hreaderinfo")
public String getUserInfo(@RequestHeader("Accept-Encoding") String encoding) {// ...return "xxx";
}

2.3 使用@CookieValue綁定Cookie值

@RequestMapping("/sessioninfo")
public String getUserInfo(@CookieValue("sessionId") String sessionId) {// ...return "xxx";
}

2.4 使用POPJ對象綁定請求參數值

  Spring MVC 會按請求參數名和 POJO 屬性名進行自動匹配,自動為該對象填充屬性值。支持級聯屬性。

@RequestMapping("/personinfo")
public String getUserInfo(Person person) {// ...return "xxx";
}

  當請求URL為?/personinfo?name=luoxn28&age=23?時,就會進行POPJ對象的填充,Person類如下所示:

public class Person {String name;int age;// xxx
}

2.5 使用ServletAPI類型的參數

@RequestMapping("/servlet")
public String getUserInfo(HttpServletRequest request, HttpServletResponse response) {// ...return "xxx";
}

  SpringMVC的handler方法可以接受HttpServletRequest/HttpServletResponse/HttpSession或者是java.security.Principal/Locale/InputStream/OutputStream/Reader/Writer類型的參數。

?

3 處理數據模型

  SpringMVC有幾種方式用于數據模型輸出,有ModelAndView、Map及Model、@SessionAttributes、@ModelAttribute等。

  • ModelAndView: 處理方法返回值類型為ModelAndView時,方法體即可通過該對象添加模型數據。
  • Map及Model: 入參為org.springframework.ui.Model、org.springframework.ui.ModelMap 或 java.uti.Map 時,處理方法返回時,Map中的數據會自動添加到模型中。
  • @SessionAttributes: 將模型中的某個屬性暫存到HttpSession 中,以便多個請求之間可以共享這個屬性。
  • @ModelAttribute: 方法入參標注該注解后, 入參的對象就會放到數據模型中。
@RequestMapping("/model")
public String getUserInfo(Map<String, Object> map) {map.put("time", new Date());return "xxx";
}
@Controller
@RequestMapping("/test")
@SessionAttributes("time")
public class Test {@RequestMapping("/session")public String getUserInfo(Map<String, Object> map) {map.put("time", new Date());return "index";}
}

  當訪問url為 /test/session 時,會往服務器session中加入time屬性,其值為當前時間(new Date())。

@ModelAttribute

  在方法定義上使用 @ModelAttribute 注解:Spring MVC在調用目標處理方法前,會先逐個調用在方法級上標注了@ModelAttribute 的方法。
  在方法的入參前使用 @ModelAttribute 注解:

  • 可以從隱含對象中獲取隱含的模型數據中獲取對象,再將請求參數綁定到對象中,再傳入入參
  • 將方法入參對象添加到模型中
@Controller
@RequestMapping("/test")
@SessionAttributes("time")
public class Test {/*** 該方法會往隱含模型中添加一個名為time的模型數據* 注意:同一個瀏覽器同一段時間內,該函數只會被調用一次*/@ModelAttribute("time")public Date getDate() {Date time = new Date();System.out.println("getDate -- " + time);return time;}@RequestMapping("/model")public String getUserInfo(@ModelAttribute("time") Date time, Map<String, Object> map) {System.out.println(time);map.put("date", new Date());return "index";}
}

3.1 由@SessionAttribute引發的異常

  如果在處理類定義處標注了@SessionAttributes(“xxx”),則嘗試從會話中獲取該屬性,并將其賦給該入參,然后再用請求消息填充該入參對象。如果在會話中找不到對應的屬性,則拋出 HttpSessionRequiredException 異常。

  所以,為了避免發生異常,一般都會在請求到達handler方法前往數據模型(session域)中添加屬性,比如上面代碼中的public Date getDate()方法一樣。

?

4 視圖和視圖解析器

  SpringMVC是如何解析視圖的呢?在handler方法返回String、ModelAndView或者View后,都會被SpringMVC內部轉換為ModelAndView類型(如果handler方法為void類型的,則該方法自己負責數據渲染和返回結果)。

  Spring MVC 借助視圖解析器(ViewResolver)得到最終的視圖對象(View),最終的視圖可以是 JSP ,也可能是Excel、JFreeChart 等各種表現形式的視圖。對于最終究竟采取何種視圖對象對模型數據進行渲染,handler并不關心,handler工作重點聚焦在生產模型數據的工作上,從而實現 MVC 的充分解耦。

4.1 視圖

  視圖的作用是渲染模型數據,將模型里的數據以某種形式呈現給客戶。SpringMVC中定義了一個View接口,源碼如下,視圖對象有視圖解析器負責實例化,是無狀態的,所以不會有線程安全問題。

public interface View {String RESPONSE_STATUS_ATTRIBUTE = View.class.getName() + ".responseStatus";String PATH_VARIABLES = View.class.getName() + ".pathVariables";String SELECTED_CONTENT_TYPE = View.class.getName() + ".selectedContentType";String getContentType();void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception;}

常用的視圖實現類

4.2 視圖解析器

  SpringMVC 為邏輯視圖名的解析提供了不同的策略,可以在 Spring WEB 上下文中配置一種或多種解析策略,并指定他們之間的先后順序。每一種映射策略對應一個具體的視圖解析器實現類。視圖解析器的作用比較單一:將邏輯視圖解析為一個具體的視圖對象。所有的視圖解析器都必須實現 ViewResolver 接口。常用的視圖解析器實現類如下所示:

  可以選擇一種視圖解析器或混用多種視圖解析器,每個視圖解析器都實現了 Ordered 接口并開放出一個 order 屬性,可以通過 order 屬性指定解析器的優先順序,order 越小優先級越高。SpringMVC 會按視圖解析器順序的優先順序對邏輯視圖名進行解析,直到解析成功并返回視圖對象,否則將拋出 ServletException 異常。

  InternalResourceViewResolver是最常用的視圖解析器,也是默認的視圖解析器,負責解析JSP視圖,使用方式如下所示:

<!-- ViewResolver 視圖解析器 如果沒有配置的話,則InternalResourceViewResolver就是默認的 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="order" value="1"/> <!-- ViewResolver優先級 --><!-- 前綴 和 后綴 --><property name="prefix" value="/"/><property name="suffix" value=".jsp"/>
</bean>

4.3 關于重定向

  一般情況下,控制器方法返回字符串類型的值會被當成邏輯視圖名處理。如果返回的字符串中帶 forward: 或 redirect: 前綴時,SpringMVC 會對他們進行特殊處理:將 forward: 和redirect: 當成指示符,其后的字符串作為 URL 來處理。

  • redirect:success.jsp:會完成一個到 success.jsp 的重定向的操作
  • forward:success.jsp:會完成一個到 success.jsp 的轉發操作
@RequestMapping("/forward")
public String getUserInfo(Map<String, Object> map) {//...return "redirect:index";
}

?

5 REST編程

  實現rest風格的增刪改查,增刪改查的對象是Person類,源碼如下:

package com.luoxn28.attribute;import org.springframework.stereotype.Repository;import java.util.HashSet;
import java.util.Set;@Repository
public class Person {String name;int age;public static Set<Person> persons = null;static {persons = new HashSet<Person>();persons.add(new Person("aaa", 12));persons.add(new Person("bbb", 16));persons.add(new Person("ccc", 18));persons.add(new Person("ddd", 24));}public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}
Person類

  顯示Person、刪除Person、更新Person頁面list.jsp源碼如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><html>
<head><title>Title</title><script type="text/javascript" src="/js/jquery-1.9.1.min.js"></script><script type="text/javascript">$(function(){$(".delete").click(function(){var href = $(this).attr("href");$("form").attr("action", href).submit();return false;});})</script>
</head>
<body><form action="" method="POST"><input type="hidden" name="_method" value="DELETE"/></form><c:forEach var="person" items="${persons}">姓名:${person.name} <br/>年齡:${person.age} <br/><a class="delete" href="/rest/person/${person.name}">刪除</a><a href="/rest/person/${person.name}">更新</a><hr/></c:forEach></body>
</html>
list.jsp

  添加Person頁面post.jsp源碼如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><html>
<head><title>Title</title>
</head>
<body><form action="/rest/person" method="post">名字<input type="text" name="name" placeholder="名字"/> <br/>年齡<input type="text" name="age" placeholder="年齡"/> <br/><input type="submit" value="提交"/></form></body>
</html>
post.jsp

  Rest處理類源碼如下所示:

package com.luoxn28.rest;import com.luoxn28.attribute.Person;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;import java.util.Iterator;
import java.util.Map;
import java.util.Set;@Controller
@RequestMapping("/rest")
public class Rest {// 顯示所用Person@RequestMapping("/persons")public String persons(Map<String, Set<Person>> map) {map.put("persons", Person.persons);return "list";}// 添加Person@RequestMapping(value = "/person", method = RequestMethod.POST)public String personPost(Person person, Map<String, Set<Person>> map) {Person.persons.add(person);map.put("persons", Person.persons);return "list";}// 刪除Person@RequestMapping(value = "/person/{name}", method = RequestMethod.DELETE)public String personDelete(@PathVariable("name") String name, Map<String, Set<Person>> map) {Iterator<Person> iter = Person.persons.iterator();while (iter.hasNext()) {if (iter.next().getName().equals(name)) {iter.remove();System.out.println("刪除成功 " + name);}}map.put("persons", Person.persons);return "redirect:/rest/persons";}// 更新Person@RequestMapping(value = "/person/{name}", method = RequestMethod.GET)public String personUpdate(@PathVariable("name") String name, Map<String, Set<Person>> map) {Iterator<Person> iter = Person.persons.iterator();while (iter.hasNext()) {Person person = iter.next();if (person.getName().equals(name)) {person.setAge(0);System.out.println("更新成功 " + name);}}map.put("persons", Person.persons);return "redirect:/rest/persons";}}

?

finally REST

  REST:即 Representational State Transfer。(資源)表現層狀態轉化。是目前最流行的一種互聯網軟件架構。它結構清晰、符合標準、易于理解、擴展方便,所以正得到越來越多網站的采用。
資源(Resources):網絡上的一個實體,或者說是網絡上的一個具體信息。它可以是一段文本、一張圖片、一首歌曲、一種服務,總之就是一個具體的存在。可以用一個URI(統一資源定位符)指向它,每種資源對應一個特定的 URI 。要獲取這個資源,訪問它的URI就可以,因此 URI 即為每一個資源的獨一無二的識別符。
表現層(Representation):把資源具體呈現出來的形式,叫做它的表現層(Representation)。比如,文本可以用 txt 格式表現,也可以用 HTML 格式、XML 格式、JSON 格式表現,甚至可以采用二進制格式。

狀態轉化(State Transfer):每發出一個請求,就代表了客戶端和服務器的一次交互過程。HTTP協議,是一個無狀態協議,即所有的狀態都保存在服務器端。因此,如果客戶端想要操作服務器,必須通過某種手段,讓服務器端發生“狀態轉化”(State Transfer)。而這種轉化是建立在表現層之上的,所以就是 “表現層狀態轉化”。具體說,就是 HTTP 協議里面,四個表示操作方式的動詞:GET、POST、PUT、DELETE。它們分別對應四種基本操作:GET 用來獲取資源,POST 用來新建資源,PUT 用來更新資源,DELETE 用來刪除資源。

REST示例

  • – /order/1 HTTP GET :得到 id = 1 的 order
  • – /order/1 HTTP DELETE:刪除 id = 1的 order
  • – /order/1 HTTP PUT:更新id = 1的 order
  • – /order HTTP POST:新增 order

?

參考資料:

  1、尚硅谷SpringMVC學習視頻及資料

  2、Spring學習之第一個Spring MVC程序(IDEA開發環境)

轉載于:https://www.cnblogs.com/luoxn28/p/5608371.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287222.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287222.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287222.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android之RxPermissions用kotlin寫沒反應

1 問題 用rxPermisssons下面的寫法沒反應 RequiresApi(Build.VERSION_CODES.N)fun test(){val rxPermissions RxPermissions(this)rxPermissions.requestEach(Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE).subscribe {object : Consumer<Perm…

基于.NetCore開發博客項目 StarBlog - (7) 頁面開發之文章詳情頁面

系列文章基于.NetCore開發博客項目 StarBlog - (1) 為什么需要自己寫一個博客&#xff1f;基于.NetCore開發博客項目 StarBlog - (2) 環境準備和創建項目基于.NetCore開發博客項目 StarBlog - (3) 模型設計基于.NetCore開發博客項目 StarBlog - (4) markdown博客批量導入基于.N…

關 于 解 析 php 的 問 題

在搭建discuz論壇的時候出的問題&#xff0c;上次搭建用的是2.2版本&#xff0c;這次下了個2.4版的Apache發現有好多地方不一樣&#xff1b;比如在order deny allow 方面就變了Deny from all變成Require all deniedAllow from all變成Require all granted今天在配置完后開始在瀏…

【攝影測量原理】第三章:雙像立體測圖

本章主要內容: 第一節 人眼的立體視覺和立體觀測第二節 立體像對相對定向和核線幾何第三節 立體像對的前方交會第四節 單元模型的絕對定向第五節 雙像解析攝影測量 第一節 人眼的立體視覺和立體觀測 1.1 人眼的立體視覺 人用雙眼判斷景物可判斷其遠近,得到…

linux源碼編譯emqttd,emqtt編譯及簡單測試記錄

emqtt&#xff1a;在Erlang中實現的MQTT客戶端庫和命令行工具&#xff0c;支持MQTT v5.0 / 3.1.1 / 3.1。下載源碼編譯cd emqtt & make運行./rebar3 shell測試1、初始化{ok, ConnPid} emqtt:start_link([{clientid, "2020"},{keepalive, 0},{proto_ver, v5},{ho…

《看聊天記錄都學不會C語言?太菜了吧》(18)2分鐘搞結構體

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋…

【攝影測量原理】第四章:解析空中三角測量

第一節 概述第二節 航帶法解析空中三角測量第三節 獨立模型法解析空中三角測量第四節 光束法解析空中三角測量第五節 GPS輔助空中三角測量第六節 機載POS系統對地定位 第一節 概述 空中三角測量 是立體攝影測量中,根據少量的野外控制點,在室內進…

setInterval和setTimeout的使用區別

setTimeout和setInterval的使用 這兩個方法都可以用來實現在一個固定時間段之后去執行JavaScript。不過兩者各有各的應用場景。 方 法 實際上&#xff0c;setTimeout和setInterval的語法相同。它們都有兩個參數&#xff0c;一個是將要執行的代碼字符串&#xff0c;還有一個是以…

「System Design」設計一個短鏈接系統

短鏈接系統可以把比較長的 URL 網址轉換成簡短的網址字符串&#xff0c;短鏈接的優勢是方便傳播。適合在一些對字符串長度有要求的場景中使用&#xff0c;比如短信&#xff0c;微博等&#xff0c;比如https://www.cnblogs.com/myshowtime/p/16227260.html轉換成短鏈接為https:/…

Android之頁面有變化用onWindowFocusChanged來監聽權限是否開啟

1 問題 我們需要在Activity里面監聽網絡變化、熱點是否開啟和關閉、GPS服務是否開啟、位置權限是否開啟等一些列行為。 2 思路 方法一: 如果是需要啟動activity進行權限申請,我們可以用如下組合模式 var intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)startA…

iOS中 Animation 動畫大全 韓俊強的博客

每日更新關注:http://weibo.com/hanjunqiang 新浪微博&#xff01; iOS開發者交流QQ群&#xff1a; 4463102061.iOS中我們能看到的控件都是UIView的子類,比如UIButton UILabel UITextField UIImageView等等 2.UIView能夠在屏幕的顯示是因為在創建它的時候內部自動添加一個CALa…

IROS 2017上,這些廠商將會給我們展示什么樣的黑科技?

相比起大多數AI學術會議&#xff0c;機器人領域最具影響力的學術會議IROS要“好看”得多。在這個學術會議上不僅會有AI和機器人領域最新的研究成果的論文展示&#xff0c;更有不少來自于科研機構和機器人領域公司機器人&#xff0c;向我們展示著展示機器之美。 比如&#xff0c…

《看聊天記錄都學不會C#?太菜了吧》(3)變量:我大哥呢?$:小弟我罩著你!

本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋了新手在學習中的一般問題。此系列將會持續更新&#xff0c;包括別的語言以及實戰都將使用對話的方式進行教學&#xff0c;基礎編程語言教學適用于零基礎小白&#xff0c;之后實戰課程也將會逐步更新。 若…

linux block設備,Linux I/O Block--塊設備的表示

塊設備的分區信息由struct hd_struct結構描述&#xff0c;其中最重要的信息就是分區的起始扇區號和分區的大小。所有分區信息都一起保存在gendisk的part_tbl結構中&#xff0c;同時每個分區的block_device也可以通過bd_part來查詢對應的分區信息。下圖描述了block_device,gendi…

【搶鮮版】ArcGIS 10.7手把手經典圖文安裝教程(附安裝包下載地址)

軟件更新真是個快,ArcGIS10.7已經亮相了!回頭想想,作者追隨ArcGIS已經有11個年頭了(從ArcGIS 9.2到ArcGIS10.7,每個版本都搶鮮使用,先睹為快),本文演示10.7完美安裝過程(附下載地址),親測可用! 目 錄 一、系統環境要求 二、軟件安裝過程 三、軟件下載地址 一、…

Android之解決ViewPager2+PhotoView滑動圖片花屏問題

1 問題 用ViewPager2和開源框架PhotoView(com.github.chrisbanes.photoview.PhotoView)組合實現滑動預覽圖片, 但是部分機型出現花屏效果 2 原因 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas…

請來圍觀:WPF開發的微信客戶端!!!

本文經原作者授權以原創方式二次分享&#xff0c;歡迎轉載、分享。原文作者&#xff1a;眾尋原文鏈接&#xff1a;https://www.cnblogs.com/ZXdeveloper/p/6058206.html公司的同事離職了&#xff0c;接下來的日子可能會忙碌&#xff0c;能完善DEMO的時間也會少了&#xff0c;因…

C#字符串、字節數組和內存流間的相互轉換 - IT浪潮之巔

定義string變量為str,內存流變量為ms,比特數組為bt 1.字符串>比特數組 (1)byte[] btSystem.Text.Encoding.Default.GetBytes("字符串");(2)byte[] btConvert.FromBase64String("字符串"); 補充&#xff1a; System.Text.Encoding.Unicode.GetBytes(str)…

ios-新浪微博-下拉刷新獲取最新的消息(解決消息重復的問題)(五)

2019獨角獸企業重金招聘Python工程師標準>>> 第一步 在上一篇博文的基礎上&#xff0c;利用新浪提供的since_id進行判斷&#xff0c;在刷新監聽的方法中&#xff0c;引入下面的代碼 結果如下圖 轉載于:https://my.oschina.net/iOSliuhui/blog/520495

sqlserver快速查找所有存儲過程中是否包含某字符

--將text替換成你要查找的內容 select name from sysobjects o, syscomments s where o.id s.id and text like %text% and o.xtype P --將text替換成你要查找的內容 SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_DEFINITION LI…