SpringMVC【開發Controller】詳解

来源:https://www.cnblogs.com/Java3y/archive/2018/03/16/8578153.html
-Advertisement-
Play Games

前言 本文主要是講解在Controller中的開發,主要的知識點有如下: 編碼過濾器 使用註解開發 註解 詳解 業務方法接收參數 字元串轉日期 重定向和轉發 返回JSON SpringMVC過濾編碼器 在SpringMVC的控制器中,如果沒有對編碼進行任何的操作,那麼獲取到的中文數據是亂碼! 即使我 ...


前言

本文主要是講解在Controller中的開發,主要的知識點有如下:

  • 編碼過濾器
  • 使用註解開發
  • 註解@RequestMapping詳解
  • 業務方法接收參數
  • 字元串轉日期
  • 重定向和轉發
  • 返回JSON

SpringMVC過濾編碼器

在SpringMVC的控制器中,如果沒有對編碼進行任何的操作,那麼獲取到的中文數據是亂碼!

這裡寫圖片描述

即使我們在handle()方法中,使用request對象設置編碼也不行!原因也非常簡單,我們SpringMVC接收參數是通過控制器中的無參構造方法,再經過handle()方法的object對象來得到具體的參數類型的

Struts2是使用攔截器來自動幫我們完成中文亂碼的問題的。那麼SpringMVC作為一個更加強大的框架,肯定也有對應的方法來幫我們完成中文亂碼問題!

值得註意的是:該過濾編碼器只能解決POST的亂碼問題

我們只需要在web.xml配置文件中設置過濾編碼器就行了


    <!-- 編碼過濾器 -->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>
            org.springframework.web.filter.CharacterEncodingFilter
        </filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

這裡寫圖片描述


註解開發SpringMVC

我們在快速入門的例子中使用的是XML配置的方式來使用SpringMVC的,SpringMVC也能夠支持註解。【個人非常喜歡註解的方式】

我們在使用Action的時候,要麼繼承著AbstractCommandController類,要麼顯示使用註解Controller介面。當我們使用了註解以後就不用顯示地繼承或實現任何類了

開發流程

使用@Controller這個註解,就表明這是一個SpringMVC的控制器!


@Controller
public  class HelloAction  {
    
}

當然了,現在Spring是不知道有這麼一個註解的,因此我們需要在配置文件中配置掃描註解

值得註意的是:在配置掃描路徑的時候,後面不要加.*

不然掃描不了,我不知道學Struts2還是其他的地方時候,習慣加了.*,於是就搞了很久!

   <!--掃描註解,後面不要加.*-->


    <context:component-scan base-package="zhongfucheng"/>

在控制器中寫業務方法

@Controller
public class HelloAction {

    /**
     *
     * @RequestMapping 表示只要是/hello.action的請求,就交由該方法處理。當然了.action可以去掉
     * @param model 它和ModelAndView類似,它這個Model就是把數據封裝到request對象中,我們就可以獲取出來
     * @return 返回跳轉的頁面【真實路徑,就不用配置視圖解析器了】
     * @throws Exception
     */
    @RequestMapping(value="/hello.action")

    public String hello(Model model) throws Exception{
        System.out.println("HelloAction::hello()");
        model.addAttribute("message","你好");
        return "/index.jsp";
    }

}

跳轉到index頁面,首頁得到對應的值。


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  這是我的首頁 <br>
  ${message}
  </body>
</html>

這裡寫圖片描述


當然了,基於註解和基於XML來開發SpringMVC,都是通過映射器、適配器和視圖解析器的。 只是映射器、適配器略有不同。但是都是可以省略的!


    <!-- 基於註解的映射器(可選) -->
    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>

    <!-- 基於註解的適配器(可選) -->
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

    <!-- 視圖解析器(可選) -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>

更新:上邊的適配器和映射器只是Spring3.1版本之前使用的、3.1版本之後現在一般用以下的兩個


映射器:
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping


適配器:
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter

當然了,這上面兩個配置也可以使用<mvc:annotation-driven>>替代註解處理器和適配器的配置。


RequestMapping

**@RequestMapping能夠控制請求路徑和請求方式!**

一個控制器寫多個業務方法

到目前為止,我們都是一個控制器寫一個業務方法,這肯定是不合理的。我們在Struts2中一個Action就對應多個業務方法了。那麼我們在SpringMVC中又怎麼寫呢???

其實我們可以推理出來,@RequestMapping就是用於配置哪個請求對應哪個業務方法的!


public @interface RequestMapping {
    String[] value() default {};

    RequestMethod[] method() default {};

    String[] params() default {};

    String[] headers() default {};
}

當我們請求hello.action的時候,處理的業務方法是hello().....當我們請求bye.action的時候,處理的業務方法是bye()


@Controller
public class HelloAction {

    /**
     *
     * @RequestMapping 表示只要是/hello.action的請求,就交由該方法處理。當然了.action可以去掉
     * @param model 它和ModelAndView類似,它這個Model就是把數據封裝到request對象中,我們就可以獲取出來
     * @return 返回跳轉的頁面【真實路徑,就不用配置視圖解析器了】
     * @throws Exception
     */
    @RequestMapping(value="/hello.action")
    public String hello(Model model) throws Exception{
        System.out.println("HelloAction::hello()");
        model.addAttribute("message","你好");
        return "/index.jsp";
    }
    @RequestMapping(value = "/bye.action")
    public String bye(Model model) throws Exception {
        model.addAttribute("message","再見");
        return "/index.jsp";
    }
}

這裡寫圖片描述

分模塊開發

當然了,我們在Struts2常常使用namespace來進行分模塊開發,在SpringMVC中我們也可以這樣乾,並且我們又是使用的是@RequestMapping這個註解!

只要把@RequestMapping這個註解寫到類上面去,就代表了分模塊。



@Controller
//我們知道,如果是value屬性上的註解,我們可以把value省略掉的
@RequestMapping("/zhongfucheng")
public class HelloAction {

    /**
     * @param model 它和ModelAndView類似,它這個Model就是把數據封裝到request對象中,我們就可以獲取出來
     * @return 返回跳轉的頁面【真實路徑,就不用配置視圖解析器了】
     * @throws Exception
     * @RequestMapping 表示只要是/hello.action的請求,就交由該方法處理。當然了.action可以去掉
     */
    @RequestMapping(value = "/hello.action")
    public String hello(Model model) throws Exception {
        System.out.println("HelloAction::hello()");
        model.addAttribute("message", "你好");
        return "/index.jsp";
    }

    @RequestMapping(value = "/bye.action")
    public String bye(Model model) throws Exception {
        model.addAttribute("message", "再見");
        return "/index.jsp";
    }
}

那麼我們想要HelloAction該控制器處理我們的請求,訪問的地址要麼是:http://localhost:8080/zhongfucheng/hello.action,或者要麼是http://localhost:8080/zhongfucheng/bye.action


限定某個業務控制方法,只允許GET或POST請求方式訪問

我們如果想要限定某個業務控制方法,只允許GET或POST請求方式訪問。還是通過@RequestMapping來實現。只要設定它的method屬性就行了


    @RequestMapping(value = "/bye.action",method = RequestMethod.POST)
    public String bye(Model model) throws Exception {
        model.addAttribute("message", "再見");
        return "/index.jsp";
    }

當我把業務方法的請求設置為POST以後,我想要通過GET方式來訪問該業務方法。就行不通了!

這裡寫圖片描述


業務方法寫入傳統web參數

我們的業務方法除了可以寫Model這個參數以外,如果有需要我們還可以寫request,response等傳統Servlet的參數。這是一樣可以使用的....

但是呢,我們並不建議使用傳統的web參數,因為會耦合


@RequestMapping(method=RequestMethod.POST,value="/register")
    public String registerMethod(HttpServletRequest request,HttpServletResponse response) throws Exception{
        
        //獲取用戶名和薪水
        String username = request.getParameter("username");
        String salary = request.getParameter("salary");
        System.out.println("用戶註冊-->" + username + ":" + salary);
        
        //綁定到session域對象中
        request.getSession().setAttribute("username",username);
        request.getSession().setAttribute("salary",salary);
        
        //重定向/jsp/success.jsp頁面
        //response.sendRedirect(request.getContextPath()+"/jsp/success.jsp");
        
        //轉發/jsp/ok.jsp頁面
        request.getRequestDispatcher("/jsp/ok.jsp").forward(request,response);
        
        //轉發(提倡)
        return "/jsp/success.jsp";
    }

小細節:如果我們的返回值是返回一個真實路徑,而我們在程式中又使用了轉發或重定向。。。那麼具體跳轉的位置就是按我們程式中跳轉的路徑為準

業務方法收集參數

我們在Struts2中收集web端帶過來的參數是在控制器中定義成員變數,該成員變數的名字與web端帶過來的名稱是要一致的...並且,給出該成員變數的set方法,那麼Struts2的攔截器就會幫我們自動把web端帶過來的參數賦值給我們的成員變數....

那麼在SpringMVC中是怎麼收集參數的呢????我們SpringMVC是不可能跟Struts2一樣定義成員變數的,因為SpringMVC是單例的,而Struts2是多例的。因此SpringMVC是這樣乾的:

  • 業務方法寫上參數
  • 參數的名稱要和web端帶過來的數據名稱要一致

接收普通參數

如果是普通參數的話,我們直接在方法上寫上與web端帶過來名稱相同的參數就行了!


<form action="${pageContext.request.contextPath}/hello.action" method="post">
    <table align="center">
        <tr>
            <td>用戶名:</td>
            <td><input type="text" name="username"></td>
        </tr>
        <tr>
            <td>編號</td>
            <td><input type="text" name="id"></td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" value="提交">
            </td>
        </tr>
    </table>

</form>

    @RequestMapping(value = "/hello.action")
    public String hello(Model model, String username, int id) throws Exception {

        System.out.println("用戶名是:" + username);
        System.out.println("編號是:" + id);

        model.addAttribute("message", "你好");
        return "/index.jsp";
    }

效果:

這裡寫圖片描述


接收JavaBean

我們處理表單的參數,如果表單帶過來的數據較多,我們都是用JavaBean對其進行封裝的。那麼我們在SpringMVC也是可以這麼做的。

  • 創建Javabean
  • javaBean屬性與表單帶過來的名稱相同
  • 在業務方法上寫上Javabean的名稱

創建JavaBean,javaBean屬性與表單帶過來的名稱相同


public class User {

    private String id;
    private String username;

    public User() {
    }
    public User(String id, String username) {
        this.id = id;
        this.username = username;
    }
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", username='" + username + '\'' +
                '}';
    }
}

在業務方法參數上寫入Javabean


    @RequestMapping(value = "/hello.action")
    public String hello(Model model,User user) throws Exception {

        System.out.println(user);
        model.addAttribute("message", "你好");
        return "/index.jsp";
    }

這裡寫圖片描述


收集數組

收集數組和收集普通的參數是類似的,看了以下的代碼就懂了。


<form action="${pageContext.request.contextPath}/hello.action" method="post">
    <table align="center">
        <tr>
            <td>用戶名:</td>
            <td><input type="text" name="username"></td>
        </tr>
        <tr>
            <td>愛好</td>
            <td><input type="checkbox" name="hobby" value="1">籃球</td>
            <td><input type="checkbox" name="hobby" value="2">足球</td>
            <td><input type="checkbox" name="hobby" value="3">排球</td>
            <td><input type="checkbox" name="hobby" value="4">羽毛球</td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" value="提交">
            </td>
        </tr>
    </table>

</form>

業務方法獲取參數


    @RequestMapping(value = "/hello.action")
    public String hello(Model model,int[] hobby) throws Exception {


        for (int i : hobby) {
            System.out.println("喜歡運動的編號是:" + i);

        }

        model.addAttribute("message", "你好");
        return "/index.jsp";
    }

效果:

這裡寫圖片描述

收集List<JavaBean>集合

我們在Spring的業務方法中是不可以用List,SpringMVC給了我們另一種方案!

我們使用一個JavaBean把集合封裝起來,給出對應的set和get方法。那麼我們在接收參數的時候,接收的是JavaBean


/**
 * 封裝多個Emp的對象 
 * @author AdminTC
 */
public class Bean {
    private List<Emp> empList = new ArrayList<Emp>();
    public Bean(){}
    public List<Emp> getEmpList() {
        return empList;
    }
    public void setEmpList(List<Emp> empList) {
        this.empList = empList;
    }
}

業務方法接收JavaBean對象


    /**
     * 批量添加員工
     */
    @RequestMapping(value="/addAll",method=RequestMethod.POST)
    public String addAll(Model model,Bean bean) throws Exception{
        for(Emp emp:bean.getEmpList()){
            System.out.println(emp.getUsername()+":"+emp.getSalary());
        }
        model.addAttribute("message","批量增加員工成功");
        return "/jsp/ok.jsp";
    }

在JSP頁面直接寫上empList[下表].


<form action="${pageContext.request.contextPath}/emp/addAll.action" method="POST">
        <table border="2" align="center">
            <caption><h2>批量註冊員工</h2></caption>
            <tr>
                <td><input type="text" name="empList[0].username" value="哈哈"/></td>
                <td><input type="text" name="empList[0].salary" value="7000"/></td>
            </tr>
            <tr>
                <td><input type="text" name="empList[1].username" value="呵呵"/></td>
                <td><input type="text" name="empList[1].salary" value="7500"/></td>
            </tr>
            <tr>
                <td><input type="text" name="empList[2].username" value="班長"/></td>
                <td><input type="text" name="empList[2].salary" value="8000"/></td>
            </tr>
            <tr>
                <td><input type="text" name="empList[3].username" value="鍵狀哥"/></td>
                <td><input type="text" name="empList[3].salary" value="8000"/></td>
            </tr>
            <tr>
                <td><input type="text" name="empList[4].username" value="綠同學"/></td>
                <td><input type="text" name="empList[4].salary" value="9000"/></td>
            </tr>
            <tr>
                <td colspan="2" align="center">
                    <input type="submit" value="批量註冊"/>
                </td>
            </tr>
        </table>
    </form>

其實這種方法看起來也沒有那麼難理解,我們就是向上封裝了一層【與接收普通的JavaBean類似的】


收集多個模型

我們有可能在JSP頁面上即有User模型的數據要收集,又有Emp模型的數據要收集....並且User模型的屬性和Emp模型的屬性一模一樣....此時我們該怎麼辦呢???

我們也是可以在User模型和Emp模型上向上抽象出一個Bean,該Bean有Emp和User對象

/**
 * 封裝User和Admin的對象
 * @author AdminTC
 */
public class Bean {
    private User user;
    private Admin admin;
    public Bean(){}
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public Admin getAdmin() {
        return admin;
    }
    public void setAdmin(Admin admin) {
        this.admin = admin;
    }
}

在JSP頁面收集的時候,給出對應的類型就行了。


    <form action="${pageContext.request.contextPath}/person/register.action" method="POST">
        <table border="2" align="center">
            <tr>
                <th>姓名</th>
                <td><input type="text" name="user.username" value="${user.username}"/></td>
            </tr>
            <tr>
                <th>月薪</th>
                <td><input type="text" name="user.salary" value="${user.salary}"></td>
            </tr>
            <tr>
                <th>入職時間</th>
                <td><input 
                        type="text" 
                        name="user.hiredate" 
                        value='<fmt:formatDate value="${user.hiredate}" type="date" dateStyle="default"/>'/></td>
            </tr>
            <tr>
                <td colspan="2" align="center">
                    <input type="submit" value="普通用戶註冊" style="width:111px"/>
                </td>
            </tr>
        </table>    
    </form> 

字元串轉日期類型

我們在Struts2中,如果web端傳過來的字元串類型是yyyy-mm-dd hh:MM:ss這種類型的話,那麼Struts2預設是可以自動解析成日期的,如果是別的字元串類型的話,Struts2是不能自動解析的。要麼使用自定義轉換器來解析,要麼就自己使用Java程式來解析....

而在SpringMVC中,即使是yyyy-mm-dd hh:MM:ss這種類型SpringMVC也是不能自動幫我們解析的。我們看如下的例子:

JSP傳遞關於日期格式的字元串給控制器...

<form action="${pageContext.request.contextPath}/hello.action" method="post">
    <table align="center">
        <tr>
            <td>用戶名:</td>
            <td><input type="text" name="username"></td>
        </tr>
        <tr>
            <td>出生日期</td>
            <td><input type="text" name="date" value="1996-05-24"></td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" value="提交">
            </td>
        </tr>
    </table>

</form>

User對象定義Date成員變數接收


 public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }

業務方法獲取Date值


    @RequestMapping(value = "/hello.action")
    public String hello(Model model, User user) throws Exception {

        System.out.println(user.getUsername() + "的出生日期是:" + user.getDate());


        model.addAttribute("message", "你好");
        return "/index.jsp";
    }

結果出問題了,SpringMVC不支持這種類型的參數:

這裡寫圖片描述


現在問題就拋出來了,那我們要怎麼解決呢????

SpringMVC給出類似於Struts2類型轉換器這麼一個方法給我們使用:如果我們使用的是繼承AbstractCommandController類來進行開發的話,我們就可以重寫initBinder()方法了....

具體的實現是這樣子的:


    @Override
    protected void initBinder(HttpServletRequest request,ServletRequestDataBinder binder) throws Exception {
        binder.registerCustomEditor(Date.class,new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true));
    }

那我們現在用的是註解的方式來進行開發,是沒有重寫方法的。因此我們需要用到的是一個註解,表明我要重寫該方法


    @InitBinder
    protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
        binder.registerCustomEditor(
                Date.class,
                new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
        
    }

再次訪問:

這裡寫圖片描述

值得註意的是:如果我們使用的是Oracle插入時間的話,那麼我們在SQL語句就要寫TimeStrap時間戳插入進去,否則就行不通


結果重定向和轉發

我們一般做開發的時候,經常編輯完數據就返回到顯示列表中。我們在Struts2是使用配置文件進行重定向或轉發的:

這裡寫圖片描述

而我們的SpringMVC就非常簡單了,只要在跳轉前寫上關鍵字就行了!



    public String hello(Model model, User user) throws Exception {

        System.out.println(user.getUsername() + "的出生日期是:" + user.getDate());
        model.addAttribute("message", user.getDate());
        return "redirect:/index.jsp";
    }

這裡寫圖片描述

以此類推,如果是想要再次請求的話,那麼我們只要寫上對應的請求路徑就行了!


    @RequestMapping(value = "/hello.action")
    public String hello(Model model, User user) throws Exception {

        return "redirect:/bye.action";
    }

    @RequestMapping("/bye.action")
    public String bye() throws Exception {

        System.out.println("我進來了bye方法");
        return "/index.jsp";
    }

這裡寫圖片描述


返回JSON文本

回顧一下Struts2返回JSON文本是怎麼操作的:

  • 導入jar包
  • 要返回JSON文本的對象給出get方法
  • 在配置文件中繼承json-default包
  • result標簽的返回值類型是json

那麼我們在SpringMVC又怎麼操作呢???

導入兩個JSON開發包

  • jackson-core-asl-1.9.11.jar
  • jackson-mapper-asl-1.9.11.jar

在要返回JSON的業務方法上給上註解:


    @RequestMapping(value = "/hello.action")
    public
    @ResponseBody
    User hello() throws Exception {

        User user = new User("1", "zhongfucheng");
        return user;
    }

配置JSON適配器


    
        <!--  
            1)導入jackson-core-asl-1.9.11.jar和jackson-mapper-asl-1.9.11.jar
            2)在業務方法的返回值和許可權之間使用@ResponseBody註解表示返回值對象需要轉成JSON文本
            3)在spring.xml配置文件中編寫如下代碼:
                -->
            <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
                <property name="messageConverters">
                        <list>
                            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
                        </list>
                </property>
            </bean>
    

測試的JSP


    <input type="button" value="Emp轉JSON"/><p>

    <input type="button" value="List<Emp>轉JSON"/><p>

    <input type="button" value="Map<String,Object>轉JSON"/><p>

    <!-- Map<String,Object>轉JSON -->
    <script type="text/javascript">
        $(":button:first").click(function(){
            var url = "${pageContext.request.contextPath}/hello.action";
            var sendData = null;
            $.post(url,sendData,function(backData,textStaut,ajax){
                alert(ajax.responseText);
            });
        });
    </script>

測試:

這裡寫圖片描述

Map測試:


    @RequestMapping(value = "/hello.action")
    public
    @ResponseBody
    Map hello() throws Exception {

        Map map = new HashMap();

        User user = new User("1", "zhongfucheng");
        User user2 = new User("12", "zhongfucheng2");
        map.put("total", user);
        map.put("rows", user2);


        return map;
    }

這裡寫圖片描述

更新------------------------------------------------------------------

如果傳遞進來的數據就是JSON格式的話,我們我們需要使用到另外一個註解@RequestBody,將請求的json數據轉成java對象

這裡寫圖片描述

這裡寫圖片描述


總結

  • 使用註解的開發避免了繼承多餘的類,並且非常簡潔高效。
  • 想要中文不亂碼,僅僅設置request的編碼格式是不行的。因為SpringMVC是通過無參的構造器將數據進行封裝的。我們可以使用SpringMVC提供的過濾器來解決中文亂碼問題。
  • RequestMapping可以設置我們具體的訪問路徑,還可以分模塊開發。基於這麼兩個原因,我們就可以在一個Action中寫多個業務方法了。
  • RequestMapping還能夠限制該請求方法是GET還是POST。
  • 在我們的業務方法中,還可以使用傳統的request和response等對象,只不過如果不是非要使用的話,最好就別使用了。
  • 對於SpringMVC自己幫我們封裝參數,也是需要使用與request帶過來的名稱是相同的。如果不相同的話,我們需要使用註解來幫我們解決的。
  • 如果是需要封裝成集合,或者封裝多個Bean的話,那麼我們後臺的JavaBean就需要再向上一層封裝,在業務方法上寫上Bean進行了。當然了,在web頁面上要指定對應Bean屬性的屬性
  • 字元串轉日期對象用到 @InitBinder註解來重寫方法。
  • 返回JSON對象,我們就需要用到@ResponseBody註解,如果接收JSON數據封裝成JavaBean的話,我們就需要用到@RequestBody註解。隨後在配置文件上創建對應的bean即可。

如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同學,可以關註微信公眾號:Java3y


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • break 語句和 continue 語句 break語句和continue語句都具有跳轉作用,可以讓代碼不按既有的順序執行。 break語句用於跳出代碼塊或迴圈。 top: for (var i = 0; i 帶符號位的右移運算符(zero filled right shift):符號為 void ...
  • 代碼如下: 1 /* 2 * Ext表格自定義分頁大小 插件 3 * 4 * 示例PagingToolbar 5 brr = new Ext.ux.PagingToolbar({ 6 plugins: new Ext.ui.plugins.ComboPageSize(), 7 pageSize : ...
  • 初探WebSocket node websocket socket.io 我們平常開發的大部分web頁面都是主動‘拉’的形式,如果需要更新頁面內容,則需要“刷新”一個,但Slack工具卻能主動收到信息,好像服務端能主動給客戶端推送信息,請研究一下這是怎麼實現的。 WebSocket websocke ...
  • Typescript 在前端圈已經逐漸普及,Vue 2.5.0 改進了類型聲明,使得對 TypeScript 更加友好 不過要想在項目中直接使用 TypeScript 仍然需要對項目進行一些改造 PS: 建議使用 Visual Studio Code 進行開發 一、安裝依賴 首先還是用 vue-cl ...
  • 假如你正在運行的微服務少於100,那麼你或許可以規避這些問題,但如果將服務擴展到任意更大的量級,這將帶來其自有的問題,為了使系統高效運行,你需要解決它們。 1:組織性孤立和蔓延 Conway法則的反模式表明,公司的組織結構能夠映射其軟體架構。Fowler-Rigetti稱,一家向微服務遷移的公司經常 ...
  • 1.1 基於TCP協議的RPC 1.1.1 RPC名詞解釋 RPC的全稱是Remote Process Call,即遠程過程調用,RPC的實現包括客戶端和服務端,即服務調用方和服務提供方。服務調用方發送RPC請求到服務提供方,服務提供方根據請求的參數執行請求方法,並將結果返回給服務調用方,一次RPC ...
  • 1.request.getParameter()在get和post方法中文亂碼問題。 參考網址:http://blog.csdn.net/u013476542/article/details/52845547 2.解決windows下tomcat埠被占用 參考網址:http://blog.csdn ...
  • 本篇總結關於http的相關知識,主要內容參考如下導圖: 主要講解的內容有: 1 URL與URI的區別。 2 請求報文與相應報文的內容。 3 GET與POST的區別。 4 http的cookie、持久化、管道化、多部分對象集合、範圍請求等。 後續會更新http其他的相關知識。 關鍵詞概念 平時會經常接 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...