中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

spring ?MVC

發布時間:2020-08-06 14:56:22 來源:網絡 閱讀:592 作者:Turnsole1 欄目:軟件技術

Spring Web MVC

Spring Web MVC需要使用IOC功能。

用于開發MVC結構的Web程序。

一.MVC思想

   將程序組件分為模型,視圖,控制器三部分。

二.Spring如何實現MVC

     a.瀏覽器發出一個HTTP請求

     b.請求首先進入DispatcherServlet主控制器

     c.主控制器調用HandlerMapping組件根據請求找映射的Controller處理

     d.執行Controller處理方法,將返回結果給ViewResolver組件

     e.ViewResolver組件根據Controller返回結果定位視圖JSP,將模型數據傳遞給JSP

     f.由JSP生成響應結果,給瀏覽器輸出


spring ?MVC

發請求到DispatcherServlet,然后到HandlerMapping到Controller1接下來返回一個ViewResolver到視圖。


eg:頁面上發出hello.do請求,首先經過web.xml,知道.do請求需要進入到DispatcherServlet,DispatcherServlet去applicationContext.xml里面

        尋找handlerMapping組件,根據mapping名為hello.do找hello.do找helloController組件處理。根據helloController里的ModelAndView和applicationContext.xml的prefix和suffix配置去找到/WEB-INF/hello.jsp

eg1:顯示登錄頁面

/tologin.do

—>DispatcherServlet(配置)//充當主控制器,發請求時先給他

—>hanlderMapping(配置)//定義Servlet請求和Controller對應關系,根據applicationContext.xml配置解析對應的哪一個Controller

—>toLoginController(編寫+配置)//調用DAO模型組件

—>ViewerResolver(配置)//封裝,轉發,重定向到JSP視圖

—>WEB-INF/login.jsp(編寫)


3.Spring Web MVC處理流程

a.RequestMappingHandlerMapping組件

   @RequestMapping(“login.do”)該標記用在Controller業務方法前

b.Controller編寫和配置

   取消了實現Controller接口及方法約定,可以允許程序員按需靈活定義業務方法;

public ModelAndView或String 方法名(根據request,session,response)

Controller需要掃描到Spring容器,必須使用@Controller

 eg: public String execute(){

          return “hello”;

          }

d.Controller如何接收請求參數

   1)利用HttpServletRequest

   *2)利用業務方法參數(少量參數時使用)

          *--參數名與請求參數key保持一致

          —利用@RequestParam(“key")

  *3)利用實體對象當方法參數(大量參數時使用)

使用建議:少量參數使用2);大量參數使用3);如果客戶端表單數據沒有格式檢查,遇到非字符串類型參數建議使用1)

e.如何向響應JSP傳值

     *1)利用HttpServletRequest

     2)利用ModelAndView做返回值

     *3)利用ModelMap方法參數

     4)使用@ModelAttribute(“key")

          public String checkLogin(@ModuleAttribute(“user”) String username){

               return “ok”;}//ok.jsp使用${user}

          @ModelAttribute(“user")

          public String getName(){

               return “tom”;}

          等價于model.put(“user”, getName());//${user}即tom

f.Controller如何使用Session

代碼示例:

web.xml:

<servlet>
    <servlet-name>webLogin2</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>webLogin2</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

handlermapping和controller:

@Controller
public class LoginController {
    //登錄按鈕處理
    @RequestMapping("/login.do")
    public String checkLogin3(String username, String password, ModelMap modelMap, HttpSession session){
        if ("root".equals(username) && "1234".equals(password)){
            modelMap.put("user", username);
            session.setAttribute("username", username);
            return "ok";//ok.jsp 使用${user}
        } else {
            modelMap.put("msg", "用戶名或密碼錯誤");
            return "login";//login.jsp使用${msg}
        }
    }

spring配置:

<!--等價于handlermapping-->
<mvc:annotation-driven></mvc:annotation-driven>

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


<!--配置viewerResolver-->
<bean id="viewresolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--去prefix配置下找頁面-->
    <property name="prefix" value="/WEB-INF/">
    </property>
    <!--提取出.jsp結尾文件,文件名為Controller中ModelAndView返回的名字-->
    <property name="suffix" value=".jsp">
    </property>
</bean>

ok.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
</head>
<body>
<form action="ok.do" method="post">
<h3>${user} login success</h3>
    session內容: ${sessionScope.username}
</form>
</body>
</html>

login.jsp:

<%@ page language="java" pageEncoding="UTF-8"%>
<html>
<head>
</head>

<body>
<h3>用戶登錄</h3>
${msg}
<form action="login3.do" method="post">
用戶名:<input type="text" name="username"><br/>
密碼:<input type="password" name="password"><br/>
<input type="submit" value="登錄">
</form>
</body>
</html>

訪問:http://localhost:8090/webLogin2_war(此處為自己定義的war包名)/login.do

用正確的用戶名密碼進入顯示:

root login success

session內容: root


4.Spring Web MVC

1) 解決中文接收亂碼問題

<!--spring mvc解決中文亂碼-->
<filter>
   <filter-name>myfilter</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>myfilter</filter-name>
   <url-pattern>*.do</url-pattern>
   <!--或者寫<servlet-name>webLogin2</servlet-name>-->
</filter-mapping>

2)如何處理異常

    a.全局異常處理:SimpleMappingExceptionResolver

@Controller
public class ExceptionController {

    @RequestMapping("/exception.do")
    public String ex(){
            String s = null;
            s.length();
            return "ok";

    }
}

此時訪問exception.do會拋出nullpoint異常,需要進行異常處理,使用內置的全局異常處理方法

applicationContext.xml配置:

<!--異常處理器-->
<!--<prop key="異常類型">視圖名</prop>-->
<!--拋出異常后得到error視圖名傳遞給viewResolver-->
<!--<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
            <prop key="java.lang.Exception">error</prop>
        </props>
    </property>
</bean>-->

此時處理流程圖:

    spring ?MVC

    b.局部異常處理:@ExceptionHandler

public String xxx(HttpServletRequest request, Exception e){}

@Controller
public class AgeController {

    @RequestMapping("/toage.do")
    public String toage(){
        //檢查session里是否有username
        return "age";//進入age.jsp
    }

    @RequestMapping("/age.do")
    public String age(String birth, ModelMap modelMap) throws Exception {
        //接收用戶輸入的生日,計算年齡
        Date now = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-DD");
        Date birth2 = sdf.parse(birth);
        int result = now.getYear() - birth2.getYear();
        modelMap.put("msg", "年齡為: " + result);
        return "age";//進入age.jsp,${msg}
        //當出現異常時無法返回String故進入handleException方法
    }

    /*當前Controller異常處理,
    * 當執行該方法后,不會再調用ExceptionResolver
    */
    @ExceptionHandler//局部異常處理方法
    public String handleException(HttpServletRequest request, Exception e) {
        request.setAttribute("msg", "輸入信息有誤導致計算失敗");
        return "age";//返回age.jsp
    }

}

    c.自定義ExceptionResolver(實現HandlerExceptionResolver接口)

先寫自己的異常處理類:

public class MyExceptionHandler implements HandlerExceptionResolver {

    public ModelAndView resolveException(HttpServletRequest request,
                                         HttpServletResponse response,
                                         Object method, Exception e) {
        //將異常信息寫入文件
        System.out.println("將異常信息寫入文件: " + e);
        //跳轉到錯誤頁面
        ModelAndView mav = new ModelAndView();
        mav.setViewName("error");
        return mav;
    }
}

eorror.jsp

<%@ page language="java" pageEncoding="UTF-8" %>
<html>
<head>
</head>

<body>
<h3>系統繁忙</h3>
</body>
</html>

注釋掉applicationContext.xml中的全局異常處理,寫上自己的異常處理類:

<!--使用自定義的ExceptionResolver, 訪問exception.do-->
<bean class="controller.MyExceptionHandler">
</bean>

此時訪問exception.do當程序出錯時頁面將顯示系統繁忙字樣

spring ?MVC

3)如何實現登錄權限檢查

    使用session進行約定值判斷。

    實現方法:1.采用Filter(通用解決方法);2.采用攔截器(Spring WEB MVC)

    a.攔截器組件簡介

      攔截器組件時SpringMVC特有組件。

      攔截器組件可以在Controller之前攔截;可以在Controller之后攔截;可以在JSP解析完畢給瀏覽器輸出之前攔截。

    b.攔截器使用方法

        首先編寫一個攔截器組件(實現HandlerInterceptor接口)

        在約定方法中添加要插入的邏輯然后在applicationContext.xml中配置

spring ?MVC

攔截器類:

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    //controlller之前,權限檢查,登錄檢查
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("---preHandle實現登錄檢查---");
        HttpSession session = request.getSession();
        //獲取登錄成功后放置的用戶信息
        String name = (String) session.getAttribute("username");
        if (name != null) {//登錄過
            return true;//繼續執行mvc后續流程
        } else {//登錄失效(session失效)或登錄失敗
            response.sendRedirect("/tologin.do");
            return false;//終止mvc后續流程
        }
    }

    @Override
    //controller之后,統計請求到處理開始到完畢的日志,執行的時間性能監控,檢查耗時項
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("---postHandle---");
    }

    @Override
    //請求處理完畢,輸出之前。統計請求到處理開始到完畢的日志,執行的時間性能監控,檢查耗時項
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("---afterHandle---");
    }
}

applicationContext.xml

<!--配置攔截器-->
<mvc:interceptors>
    <mvc:interceptor>
        <!--攔截哪些請求-->
        <!--<mvc:mapping path="toage.do"/>-->
        <mvc:mapping path="/**/"/>
        <!--放過哪些請求-->
        <mvc:exclude-mapping path="/tologin.do"/>
        <mvc:exclude-mapping path="/login3.do"/>
        <bean class="controller.LoginInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

四会市| 辉县市| 平凉市| 太和县| 石棉县| 灯塔市| 紫云| 那坡县| 临沧市| 忻城县| 漳平市| 游戏| 万荣县| 贺州市| 托里县| 建始县| 霍城县| 长汀县| 钟祥市| 囊谦县| 于都县| 资兴市| 犍为县| 商南县| 玉龙| 荃湾区| 沁水县| 常州市| 招远市| 灵武市| 谢通门县| 石棉县| 洛隆县| 璧山县| 青岛市| 大城县| 鹤庆县| 应城市| 大荔县| 修水县| 铜川市|