5二、springMVC框架

SpringMVChtml

概念:SpringMVC是一種基於java的實現MVC設計模型的請求驅動類型的輕量級web框架,屬於springFramework的後續產品,已經融合在Spring Web Flow裏面,Spring框架提供了構建web應用程序的全功能MVC模塊,使用Spring可插入的MVC框架,從而在使用Spring進行WEB開發時,能夠選擇使用Spring的SpringMVC框架或集成其餘MVC框架。前端

它經過一套註解,讓一個簡單的Java類成爲處理請求的控制器,而無序實現任何接口,同時它還支持RESTful編程風格的請求。java

 

入門代碼:web

第一步:配置前端控制器,在web.xml中spring

<!--配置前端控制權-->
<servlet>
  <servlet-name>dispatcherServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:springmvc.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>dispatcherServlet</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

二、建立控制類數據庫

@Controller
public class HelloController {

    @RequestMapping(path = "/hello")//用於創建請求URL和處理請求方法之間的對應關係
    /*
    * 屬性;path/value ,映射路徑
    *      method,當前方法能夠接受怎麼樣的請求方式
    *      params,用於請求參數的條件
    *      handers,發送的請求必須包含請求頭
    * */
    public  String sayHello(){
        System.out.println("hello StringMvc");
        return "success";
    }
}

三、在資源文件夾下建立配置文件編程

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">



    <context:component-scan base-package="lianbang.wu"></context:component-scan>

    <!--視圖解析器對象-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >

        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--開啓-springmvc框架註解支持 自動配置處理器映射器和處理器適配器-->
    <mvc:annotation-driven />


    <!--配置類型轉換器-->
    <bean id="cs" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters" >
            <set>
                <bean class="lianbang.wu.utils.StringToDateConverter"></bean>
            </set>
        </property>
    </bean>

    <!--前端控制權哪些靜態資源不攔截-->
    <mvc:resources mapping="/js/**" location="/js/**"/>
</beans>

程序解析:瀏覽器

一、啓動服務器,加載一些配置文件spring-mvc

二、發送請求,後臺處理請求緩存

 

組件介紹:springmvc框架基於組件方式執行流程

前端控制器:DispatcherServlet,它至關於mvc中的c,由它調用其餘組件處理用戶的請求,下降組件間的耦合性

處理器映射器:HandlerMapping,負責根據用戶請求找到handler(處理器)

處理器適配器:HandlerAdapter,對處理器進行執行

處理器:Handler,它就是咱們開發中要編寫的具體業務控制器

視圖解析器:ViewResolver,負責處理結果生成view視圖

 

請求參數綁定

入門代碼:

一、發送請求參數

<form action="/param/testParam" method="post">
    用戶名:<input type="text" name="username"/><br>
</form>

二、請求參數綁定,自動進行同名參數的綁定

@Controller
@RequestMapping("/param")
public class ParamController {

    @RequestMapping("/testParam")
    public String testParam(String username){
        System.out.println("執行了。。。"+username);
        return "success";
    }
}

請求參數綁定實體類:

一、建立實體類

public class DemoClass implements Serializable {
    private  String username;
    private String password;
    private Double money;
//------省略get,set方法,自行添加
}

二、發送請求

<form action="/param/save" method="post">
    用戶名:<input type="text" name="username"/><br>
    密碼:<input type="text" name="password"/><br>
    金額:<input type="text" name="money"/><br>
</form>

三、自動進行實體類型綁定

@Controller
@RequestMapping("/param")
public class ParamController {
@RequestMapping("/save")
public String save(DemoClass demoClass){
    System.out.println(demoClass);
    return "success";
}
}

注意:解決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>

請求參數綁定集合類型:

一、發送請求

</form>
用戶id:<input type="text" name="list[0].id"/><br>
用戶年齡:<input type="text" name="list[0].age"/><br>
</form>

二、建立對應的實體類

三、自動進行參數綁定

自定義內容轉換器:解決數據內容轉換異常問題

第一步:定義一個類,實現Convrter接口,該接口有兩個泛型,分別表示接受的類型和目標類型

//自定義類型轉換器
public class StringToDateConverter implements Converter <String , Date> {

    @Override
    public Date convert(String s) {
        if (s == null){
            throw  new  RuntimeException("請傳入數據");
        }
        DateFormat df  = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date date = df.parse(s);
            return date;
        } catch (ParseException e) {
            e.printStackTrace();
            throw  new RuntimeException("數據類型轉換異常");
        }

    }
}

第二步:註冊類型轉換器

<!--開啓-springmvc框架註解支持 自動配置處理器映射器和處理器適配器-->
<mvc:annotation-driven  conversion-service="cs"/>


<!--配置類型轉換器-->
<bean id="cs" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters" >
        <set>
            <bean class="lianbang.wu.utils.StringToDateConverter"></bean>
        </set>
    </property>
</bean>

獲取servlet原生API

//獲取原生API
public String testServlet(HttpServletRequest request, HttpServletResponse response){

    return "success";
}

經常使用註解:

@RequsetParams

做用:把請求中指定名稱的參數給控制器中的形參賦值。

屬性:value,請求參數中的名稱

         required,請求參數重是否必須提供此參數,默認值:true,表示必須提供,若是不提供將報錯。

//@RequestParam
public  String testRequestParam(@RequestParam(name = "name") String username){
    return "success";
}

@RequsetBody

做用:用於獲取請求體內容,直接使用獲得是key=value&key=value···結構的數據,get請求不適用

屬性:required;是否必須有請求體,默認值是true,當取值爲true時,get請求方式會報錯,若是取值爲false,get請求獲得null。

//@RequestBody
public String testRequestBody(@RequestBody String body){
    System.out.println(body);
    return "success";
}

@PathVariable

做用:用於綁定url中的佔位符的

屬性:value:指定url中的佔位符名稱

Restful風格的URL:

一、請求路徑同樣,能夠根據不一樣的請求方式去執行後臺的不一樣方法

二、restful風格的URL優勢:一、結構清晰,二、符合標準,三、易於理解,四、擴展方便

//@PathVariable
@RequestMapping("/testPathVariable/{uid}")
public String testPathVariable(@PathVariable(name = "uid") String id){
    System.out.println(id);
    return "success";
}

@HiddentHttpMethodFilter

做用;因爲瀏覽器的form表單只支持GET和POST請求,而DELETE、PUT等method並不支持,spring3.0添加了一個過濾器,能夠將瀏覽器請求改成指定的請求方式,發送給咱們的控制器方法,使得支持GET,POST,PUT和DELETE

使用方法:

第一步:在web. xml中配置該過濾器

第二步:請求方式必須使用POST請求

第三步:按照要求提供_method請求參數,該參數的取值就是咱們須要的請求方式。

 

@RequestHeader

做用:用於獲取請求消息頭

屬性:value:提供消息頭名稱

         required:是否必須有此消息頭

//@RequestHeader
public String testRequestHeader(@RequestHeader(value = "Accept") String header){
    System.out.println(header);
    return "success";
}

@CookieValue

做用:用於把指定cookie名稱的值傳入控制器方法參數

屬性:value:指定cookie的名稱

         required:是否必須有此cookie

//@CookieValue
public String testCookieValue(@CookieValue(value = "JSESSIONID") String cookie){
    System.out.println(cookie);
    return "success";
}

@ModelAttribute

做用:用於修飾方法和參數,出如今方法上,表示當前方法會在控制器的方法執行以前,先執行。它能夠修飾沒有返回值的方法,也能夠修飾有具體返回值的方法。出如今參數上,獲取指定的數據給參數賦值

屬性:value,用於獲取數據的key,key能夠上POJO的屬性名稱,也能夠上map結構的key

應用場景:當表當提交數據不是完整的實體類數據時,保證沒有提交數據的字段使用數據庫對象原來的數據。

//@ModelAttribute
@ModelAttribute
public void MyShow(){
    System.out.println("MyShow執行了");
}

@SessionAttribute

做用:用於屢次執行控制器方法間的參數共享

屬性:value:用於指定存入的屬性名稱

         type:用於指定存入的數據類型

做用於類上。

 

Springmvc的響應數據和結果視圖

響應返回值是String類型:

//返回值爲String
@RequestMapping("/testString")
public String testString(Model model){
    System.out.println("testString執行了");
    return "success";
}

響應返回值是void類型:

//返回值爲void
public void testvoid(HttpServletRequest request , HttpServletResponse response) throws ServletException, IOException {
    System.out.println("testvoid方法執行");
    request.getRequestDispatcher("/WEB-INF/Pages/success.jsp").forward(request,response);//請求轉發
    response.sendRedirect(request.getContextPath()+"/success.jsp");//重定向
    //直接響應
    response.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=UTF-8");
    response.getWriter().print("hello");
}

 文件上傳

傳統方式代碼:

<h3>文件上傳:傳統方式</h3>
<form action="/user/fileupload1" method="post" enctype="multipart/form-data">
    選擇文件:<input type="file" name="upload"/><br/>
    <input type="submit" value="上傳"/>
</form>
@RequestMapping("/fileupload1")
public String fileUpLoad(HttpServletRequest request) throws Exception {
    System.out.println("文件上傳");

    //使用fileupload組件
    String realPath = request.getSession().getServletContext().getRealPath("/uploads");
    File file = new File(realPath);
    if (!(file.exists())){
        file.mkdirs();
    }
    //解析request對象,獲取上傳文件想
    DiskFileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);
    List<FileItem> fileItems = upload.parseRequest(request);

    for (FileItem item : fileItems){
        //進行判斷,當前item對象是不是上傳文件
        if (item.isFormField()){
            //普通表單項
        }else {
            //上傳文件項
            String filename = item.getName();
            String uuid = UUID.randomUUID().toString().replace("-"," ");
            filename=uuid+"_"+filename;
            item.write(new File(realPath,filename));
            item.delete();
        }
    }

    return "success";
}

springMVC方式代碼:

<h3>文件上傳:springmvc</h3>
<form action="/user/fileupload2" method="post" enctype="multipart/form-data">
    選擇文件:<input type="file" name="upload"/><br/>
    <input type="submit" value="上傳"/>
</form>
@RequestMapping("/fileupload2")
public String fileUpLoad2(HttpServletRequest request,MultipartFile upload) throws IOException {
    System.out.println("springmvc文件上傳");
    String path = request.getSession().getServletContext().getRealPath("/uploads/");
    File file = new File(path);
    if (!file.exists()){
        file.mkdirs();
    }
    String filename = upload.getOriginalFilename();
    String uuid = UUID.randomUUID().toString().replace("-"," ");
    filename = uuid+"_"+filename;
    upload.transferTo(new File(path,filename));

    return "success";
}

跨服務方式代碼:

<h3>文件上傳:跨服務器</h3>
<form action="/user/fileupload3" method="post" enctype="multipart/form-data">
    選擇文件:<input type="file" name="upload"/><br/>
    <input type="submit" value="上傳"/>
</form>
@RequestMapping("/fileupload3")
public String fileUpLoad3(MultipartFile upload) throws IOException {
    System.out.println("跨服務器文件上傳");

    //定義上傳文件的服務器路徑
    String path = "http://localhost:9090/uploads/";



    String filename = upload.getOriginalFilename();
    String uuid = UUID.randomUUID().toString().replace("-"," ");
    filename = uuid+"_"+filename;

    //建立客戶端對象
    Client client = Client.create();
    //和圖片服務器進行鏈接
    WebResource resource = client.resource(path + filename);
    // 上傳文件
    resource.put(upload.getBytes());

    return "success";
}

在實際開發中,咱們會有不少處理不一樣功能的服務器,例如:

應用服務器:負責部署咱們的應用

數據庫服務器:運行咱們的數據庫

緩存和消息服務器:負責處理大併發訪問的緩存和消息

文件服務器:負責存儲用戶上傳文件的服務器

 

SpringMVC的攔截器:相似於servlet的Filter

一、編寫攔截器類

/*
自定義攔截器
 */
public class MyInterceptor implements HandlerInterceptor {
    /**
     * 預處理,controller方法執行前
     * 若是return true 放行,執行下一個攔截器,若是沒有,執行controller中的方法
     * 若是return false 不放行
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor執行了");
        return true;
    }

    /**
     * 後處理方法
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    /**
     * 跳轉頁面後執行
     *
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

二、配置攔截器

<!--配置攔截器-->
<mvc:interceptors>
    <mvc:interceptor>
        <!--要攔截的具體方法-->
        <mvc:mapping path="/user/*"/>
        <!--不要攔截的方法-->
        <!--<mvc:exclude-mapping path=""/>-->
        <!--配置攔截器對象-->
        <bean class="lianbang.wu.interceptor.MyInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

SpringMVC的異常處理:

一、編寫自定義異常類

public class SysException extends Exception {
    private String message;

    @Override
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public SysException(String message) {
        this.message = message;
    }
}

二、編寫異常處理器

public class SysExceptionResolver  implements HandlerExceptionResolver {
    /**
     * 處理異常的業務
     * @param httpServletRequest
     * @param httpServletResponse
     * @param o
     * @param e
     * @return
     */
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        //獲取異常對象
        SysException exception = null;
        if (e instanceof SysException){
            exception= (SysException)e;
        }else {
            exception= new SysException("系統維護");
        }

        ModelAndView mv = new ModelAndView();
        mv.addObject("errorMsg",exception.getMessage());
        mv.setViewName("error");
        return mv;
    }
}

三、配置異常處理器

<!--配置異常處理器-->
<bean id="sysExceptionResolver" class="lianbang.wu.exception.SysExceptionResolver"></bean>
相關文章
相關標籤/搜索