SpringMVC【開發(fā)Controller】詳解

前言

本文主要是講解在Controller中的開發(fā)盐须,主要的知識點有如下:

  • 編碼過濾器
  • 使用注解開發(fā)
  • 注解@RequestMapping詳解
  • 業(yè)務方法接收參數(shù)
  • 字符串轉(zhuǎn)日期
  • 重定向和轉(zhuǎn)發(fā)
  • 返回JSON

SpringMVC過濾編碼器

在SpringMVC的控制器中,如果沒有對編碼進行任何的操作阀捅,那么獲取到的中文數(shù)據(jù)是亂碼裸准!

這里寫圖片描述

即使我們在handle()方法中去扣,使用request對象設置編碼也不行!原因也非常簡單,我們SpringMVC接收參數(shù)是通過控制器中的無參構(gòu)造方法织狐,再經(jīng)過handle()方法的object對象來得到具體的參數(shù)類型的治泥。

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>
20170720102547471.png

注解開發(fā)SpringMVC

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

我們在使用Action的時候意狠,要么繼承著AbstractCommandController類粟关,要么顯示使用注解Controller接口。當我們使用了注解以后就不用顯示地繼承或?qū)崿F(xiàn)任何類了

開發(fā)流程

使用@Controller這個注解闷板,就表明這是一個SpringMVC的控制器澎灸!


@Controller
public  class HelloAction  {

}

當然了,現(xiàn)在Spring是不知道有這么一個注解的遮晚,因此我們需要在配置文件中配置掃描注解

值得注意的是:在配置掃描路徑的時候性昭,后面不要加.*

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

   <!--掃描注解萧求,后面不要加.*-->

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

在控制器中寫業(yè)務方法

@Controller
public class HelloAction {

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

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

}

跳轉(zhuǎn)到index頁面守问,首頁得到對應的值匀归。


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

當然了,基于注解和基于XML來開發(fā)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版本之后現(xiàn)在一般用以下的兩個


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

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

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


RequestMapping

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

一個控制器寫多個業(yè)務方法

到目前為止枕屉,我們都是一個控制器寫一個業(yè)務方法,這肯定是不合理的鲤氢。我們在Struts2中一個Action就對應多個業(yè)務方法了搀擂。那么我們在SpringMVC中又怎么寫呢?卷玉?哨颂?

其實我們可以推理出來,@RequestMapping就是用于配置哪個請求對應哪個業(yè)務方法的相种!


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

    RequestMethod[] method() default {};

    String[] params() default {};

    String[] headers() default {};
}

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


@Controller
public class HelloAction {

    /**
     *
     * @RequestMapping 表示只要是/hello.action的請求,就交由該方法處理箫措。當然了.action可以去掉
     * @param model 它和ModelAndView類似腹备,它這個Model就是把數(shù)據(jù)封裝到request對象中,我們就可以獲取出來
     * @return 返回跳轉(zhuǎn)的頁面【真實路徑斤蔓,就不用配置視圖解析器了】
     * @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";
    }
}
這里寫圖片描述

分模塊開發(fā)

當然了植酥,我們在Struts2常常使用namespace來進行分模塊開發(fā),在SpringMVC中我們也可以這樣干弦牡,并且我們又是使用的是@RequestMapping這個注解友驮!

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


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

    /**
     * @param model 它和ModelAndView類似稻据,它這個Model就是把數(shù)據(jù)封裝到request對象中,我們就可以獲取出來
     * @return 返回跳轉(zhuǎn)的頁面【真實路徑买喧,就不用配置視圖解析器了】
     * @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


限定某個業(yè)務控制方法今缚,只允許GET或POST請求方式訪問

我們?nèi)绻胍薅硞€業(yè)務控制方法,只允許GET或POST請求方式訪問低淡。還是通過@RequestMapping來實現(xiàn)姓言。只要設定它的method屬性就行了


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

當我把業(yè)務方法的請求設置為POST以后蔗蹋,我想要通過GET方式來訪問該業(yè)務方法何荚。就行不通了!

這里寫圖片描述

業(yè)務方法寫入傳統(tǒng)web參數(shù)

我們的業(yè)務方法除了可以寫Model這個參數(shù)以外猪杭,如果有需要我們還可以寫request餐塘,response等傳統(tǒng)Servlet的參數(shù)。這是一樣可以使用的....

但是呢皂吮,我們并不建議使用傳統(tǒng)的web參數(shù)戒傻,因為會耦合


@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域?qū)ο笾?        request.getSession().setAttribute("username",username);
        request.getSession().setAttribute("salary",salary);

        //重定向/jsp/success.jsp頁面
        //response.sendRedirect(request.getContextPath()+"/jsp/success.jsp");

        //轉(zhuǎn)發(fā)/jsp/ok.jsp頁面
        request.getRequestDispatcher("/jsp/ok.jsp").forward(request,response);

        //轉(zhuǎn)發(fā)(提倡)
        return "/jsp/success.jsp";
    }

小細節(jié):如果我們的返回值是返回一個真實路徑,而我們在程序中又使用了轉(zhuǎn)發(fā)或重定向蜂筹。需纳。。那么具體跳轉(zhuǎn)的位置就是按我們程序中跳轉(zhuǎn)的路徑為準艺挪!

業(yè)務方法收集參數(shù)

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

那么在SpringMVC中是怎么收集參數(shù)的呢慌盯?周霉??亚皂?我們SpringMVC是不可能跟Struts2一樣定義成員變量的俱箱,因為SpringMVC是單例的,而Struts2是多例的灭必。因此SpringMVC是這樣干的:

  • 業(yè)務方法寫上參數(shù)
  • 參數(shù)的名稱要和web端帶過來的數(shù)據(jù)名稱要一致

接收普通參數(shù)

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


<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

我們處理表單的參數(shù)禁漓,如果表單帶過來的數(shù)據(jù)較多跟衅,我們都是用JavaBean對其進行封裝的。那么我們在SpringMVC也是可以這么做的播歼。

  • 創(chuàng)建Javabean
  • javaBean屬性與表單帶過來的名稱相同
  • 在業(yè)務方法上寫上Javabean的名稱

創(chuàng)建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 + '\'' +
                '}';
    }
}

在業(yè)務方法參數(shù)上寫入Javabean


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

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

收集數(shù)組

收集數(shù)組和收集普通的參數(shù)是類似的,看了以下的代碼就懂了秘狞。


<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>

業(yè)務方法獲取參數(shù)


    @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的業(yè)務方法中是不可以用List叭莫,SpringMVC給了我們另一種方案!

我們使用一個JavaBean把集合封裝起來烁试,給出對應的set和get方法雇初。那么我們在接收參數(shù)的時候,接收的是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;
    }
}

業(yè)務方法接收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模型的數(shù)據(jù)要收集,又有Emp模型的數(shù)據(jù)要收集....并且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> 

字符串轉(zhuǎn)日期類型

我們在Struts2中据途,如果web端傳過來的字符串類型是yyyy-mm-dd hh:MM:ss這種類型的話绞愚,那么Struts2默認是可以自動解析成日期的,如果是別的字符串類型的話颖医,Struts2是不能自動解析的位衩。要么使用自定義轉(zhuǎn)換器來解析,要么就自己使用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;
    }

業(yè)務方法獲取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";
    }

結(jié)果出問題了僚祷,SpringMVC不支持這種類型的參數(shù):

這里寫圖片描述

現(xiàn)在問題就拋出來了,那我們要怎么解決呢贮缕?辙谜??感昼?

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

具體的實現(xiàn)是這樣子的:


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

那我們現(xiàn)在用的是注解的方式來進行開發(fā),是沒有重寫方法的定嗓。因此我們需要用到的是一個注解蜕琴,表明我要重寫該方法


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

    }

再次訪問:

20170721161314265.png

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


結(jié)果重定向和轉(zhuǎn)發(fā)

我們一般做開發(fā)的時候恃逻,經(jīng)常編輯完數(shù)據(jù)就返回到顯示列表中雏搂。我們在Struts2是使用配置文件進行重定向或轉(zhuǎn)發(fā)的:

20170721162644046.png

而我們的SpringMVC就非常簡單了,只要在跳轉(zhuǎn)前寫上關鍵字就行了寇损!


    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開發(fā)包

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

在要返回JSON的業(yè)務方法上給上注解:


    @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)在業(yè)務方法的返回值和權限之間使用@ResponseBody注解表示返回值對象需要轉(zhuǎn)成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轉(zhuǎn)JSON"/><p>

    <input type="button" value="List<Emp>轉(zhuǎn)JSON"/><p>

    <input type="button" value="Map<String,Object>轉(zhuǎn)JSON"/><p>

    <!-- Map<String,Object>轉(zhuǎn)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;
    }
這里寫圖片描述

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

如果傳遞進來的數(shù)據(jù)就是JSON格式的話,我們我們需要使用到另外一個注解@RequestBody,將請求的json數(shù)據(jù)轉(zhuǎn)成java對象

這里寫圖片描述
這里寫圖片描述

總結(jié)

  • 使用注解的開發(fā)避免了繼承多余的類烦绳,并且非常簡潔高效卿捎。
  • 想要中文不亂碼,僅僅設置request的編碼格式是不行的径密。因為SpringMVC是通過無參的構(gòu)造器將數(shù)據(jù)進行封裝的午阵。我們可以使用SpringMVC提供的過濾器來解決中文亂碼問題。
  • RequestMapping可以設置我們具體的訪問路徑享扔,還可以分模塊開發(fā)底桂。基于這么兩個原因惧眠,我們就可以在一個Action中寫多個業(yè)務方法了籽懦。
  • RequestMapping還能夠限制該請求方法是GET還是POST。
  • 在我們的業(yè)務方法中氛魁,還可以使用傳統(tǒng)的request和response等對象暮顺,只不過如果不是非要使用的話厅篓,最好就別使用了。
  • 對于SpringMVC自己幫我們封裝參數(shù)捶码,也是需要使用與request帶過來的名稱是相同的羽氮。如果不相同的話,我們需要使用注解來幫我們解決的惫恼。
  • 如果是需要封裝成集合档押,或者封裝多個Bean的話,那么我們后臺的JavaBean就需要再向上一層封裝尤筐,在業(yè)務方法上寫上Bean進行了汇荐。當然了,在web頁面上要指定對應Bean屬性的屬性盆繁。
  • 字符串轉(zhuǎn)日期對象用到 @InitBinder注解來重寫方法掀淘。
  • 返回JSON對象,我們就需要用到@ResponseBody注解油昂,如果接收JSON數(shù)據(jù)封裝成JavaBean的話革娄,我們就需要用到@RequestBody注解。隨后在配置文件上創(chuàng)建對應的bean即可冕碟。

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

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市挑庶,隨后出現(xiàn)的幾起案子言秸,更是在濱河造成了極大的恐慌,老刑警劉巖迎捺,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件举畸,死亡現(xiàn)場離奇詭異,居然都是意外死亡凳枝,警方通過查閱死者的電腦和手機抄沮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岖瑰,“玉大人叛买,你說我怎么就攤上這事√6” “怎么了聪全?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辅辩。 經(jīng)常有香客問我难礼,道長娃圆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任蛾茉,我火速辦了婚禮讼呢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谦炬。我一直安慰自己悦屏,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布键思。 她就那樣靜靜地躺著础爬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吼鳞。 梳的紋絲不亂的頭發(fā)上看蚜,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音赔桌,去河邊找鬼供炎。 笑死,一個胖子當著我的面吹牛疾党,可吹牛的內(nèi)容都是我干的音诫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼雪位,長吁一口氣:“原來是場噩夢啊……” “哼竭钝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起雹洗,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤蜓氨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后队伟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡幽勒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年嗜侮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啥容。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡锈颗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咪惠,到底是詐尸還是另有隱情击吱,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布遥昧,位于F島的核電站覆醇,受9級特大地震影響朵纷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜永脓,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一袍辞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧常摧,春花似錦搅吁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至溃斋,卻和暖如春界拦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盐类。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工寞奸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人在跳。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓枪萄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親猫妙。 傳聞我的和親對象是個殘疾皇子瓷翻,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348