国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

SpringMVC 配置和基本使用

CarterLi / 3389人閱讀

摘要:配置開啟注解模式簡化配置自動注冊默認提供了一系列的功能數(shù)據(jù)綁定數(shù)字和日期的轉換的讀寫支持映射路徑靜態(tài)資源默認配置加入對靜態(tài)資源的處理允許使用做整體配置映射后面的和類基本上都要自動包掃描,讓認識然后就可以盡情的使用了。

花了點時間做的(比較水)筆記,有可能有漏洞,有不對的,歡迎指出(如果你會看的話)。

首先都是二話不說,先找依賴(Gradle):

// spring系列
// 這個jar文件包含Spring框架基本的核心工具類,Spring其它組件要都要使用到這個包里的類,是其它組件的基本核心,當然你也可以在自己的應用系統(tǒng)中使用這些工具類。
compile group: "org.springframework", name: "spring-core", version: "4.2.5.RELEASE"
// 這個jar文件是所有應用都要用到的,它包含訪問配置文件、創(chuàng)建和管理bean以及進行Inversion of Control / Dependency Injection(IoC/DI)操作相關的所有類。
// 如果應用只需基本的IoC/DI支持,引入spring-core.jar及spring- beans.jar文件就可以了。
compile group: "org.springframework", name: "spring-beans", version: "4.2.5.RELEASE"
// 提供在基礎IOC功能上的擴展服務,此外還提供許多企業(yè)級服務的支持,有郵件服務、任務調度、JNDI定位,EJB集成、遠程訪問、緩存以及多種視圖層框架的支持。
compile group: "org.springframework", name: "spring-context", version: "4.2.5.RELEASE"
// 對JDBC 的簡單封裝
compile group: "org.springframework", name: "spring-jdbc", version: "4.2.5.RELEASE"
// 為JDBC、Hibernate、JDO、JPA等提供的一致的聲明式和編程式事務管理
compile group: "org.springframework", name: "spring-tx", version: "4.2.5.RELEASE"
// 包含Web應用開發(fā)時,用到Spring框架時所需的核心類,包括自動載入WebApplicationContext特性的類、Struts與JSF集成類、文件上傳的支持類、Filter類和大量工具輔助類
compile group: "org.springframework", name: "spring-web", version: "4.2.5.RELEASE"
// 這個jar文件包含Spring MVC框架相關的所有類。包含國際化、標簽、Theme、視圖展現(xiàn)的FreeMarker、JasperReports、Tiles、Velocity、 XSLT相關類。
// REST Web服務和Web應用的視圖控制器的實現(xiàn), 當然,如果你的應用使用了獨立的MVC框架,則無需這個JAR文件里的任何類。
compile group: "org.springframework", name: "spring-webmvc", version: "4.2.5.RELEASE"
// 對于單元測試和集成測試的簡單封裝
compile group: "org.springframework", name: "spring-test", version: "4.2.5.RELEASE"

// Spring提供的對AspectJ框架的整合
compile group: "org.springframework", name: "spring-aspects", version: "4.2.5.RELEASE"

然后SpringMVC主要還是要以來Servlet,所以需要進行配置web.xml(順帶配置一個過濾器,讓SpringMVC所有操作都是UTF-8格式):


         
    
    
        encodingFilter
        org.springframework.web.filter.CharacterEncodingFilter
        
            encoding
            UTF-8
        
    
    
        encodingFilter
        /*
    

    
    
        springmvc
        org.springframework.web.servlet.DispatcherServlet
        
            
            contextConfigLocation
            classpath:spring/spring-*.xml
        
        1
    
    
        springmvc
        /
    

在此之前可以先了解一下這兩個配置,基本上是必備的,幫我們做了很多事情。



    
    
    

    
    
    
    
    
    

然后就可以盡情的使用了。

自動屬性裝配
/**
 * 這里的屬性自動裝配,可以裝配很多東西,比如Bean對象,還有普通的字符串,當用戶請求中帶有同名的參數(shù)時,會自動把結果賦值到上面。
 * 然后還可以使用原生的Servlet對象,Spring也會自動注入,支持:
 * HttpServletRequest
 * HttpServletResponse
 * HttpSession
 * Writer
 * Reader
 * Locale
 * InputStream
 * OutputStream
 * java.security.Principal
 * 其中Write(Reader)和OutputStream(InputStream)和在Servlet一樣,不能同時使用
 **/
public BaseDTO doLogin(User user, @RequestParam(value = "login_token") String login_token, HttpServletResponse response) {
                                 
}
數(shù)據(jù)類型轉換器

之所以Spring能夠自動裝配屬性(傳入的參數(shù)都是String,但是我們接收到的可以是Integer等類型),是因為Spring寫好了一些默認的數(shù)據(jù)類型轉換器,然而為了滿足要求,我們也可以自定義轉換器:
先寫好一個類型轉換器類:

// 這個類的作用是把String轉換成Timestamp
public class JsMillisecondsToDate implements Converter {

    @Override
    public Timestamp convert(String source) {
        long millis = Long.parseLong(source);
        return new Timestamp(millis);
    }
}

然后在Spring文件中配置:





    
        
            
                
            
        
    

之后的話Spring就有了String -> Timestamp的支持,可以自動的將String裝配成Timestamp的支持。

@RequestMapping(value = "/submitText", method = RequestMethod.POST)
@ResponseBody
public BaseDTO submitText(@RequestParam("title") String title, @RequestParam("date") Timestamp date, BindingResult bindingResult) {

    return null;    
}
// 傳入的json可以是這樣的(date是一個時間戳):{"title" : "初音未來的日常", "date", "122354864"}
// Spring會用我們定義的轉換器去轉換,如果轉換出錯了,會把錯誤結果放入BindingResult對象中,可以檢查發(fā)生了什么問題。
自定義試圖解析器


    
    
        

        
        
        
        
        
        
    

    
        
    

    
        
        
        

        
        
        
        
    

    
    
        
        
        

        
        
        
    

作用:

// 其實返回的html視圖是/WEB-INF/html/welcome.html
@RequestMapping(value = {"/welcome.html", "/"}, method = RequestMethod.GET)
public String welcome() {
    return "html/welcome";
}
數(shù)據(jù)校驗

使用jsr303標準,然后加入

// hibernate 數(shù)據(jù)校驗框架
compile group: "org.hibernate", name: "hibernate-validator", version: "5.1.0.Final"

Spring配置:

 

    
    
        
        
        
        
    

    
    
        
        
        
        
        
        
    

bean的設置

public class User {

    private Integer uid;

    // 這些屬性 可以查看jsr303的文檔
    // message里的是驗證不通過時你要顯示的消息
    // 我用了消息國際化顯示成這樣{message.username.length} 在上述配置中又
    @NotBlank(message = "{message.username.length}")
    @Size(min = 1, message = "{message.username.length}")
    private String username;

    @NotBlank(message = "{message.password.length}")
    @Size(min = 8, message = "{message.password.length}")
    private String password;

    // no check
    private String email;
    
    // 省略getter setter
}

驗證數(shù)據(jù),只需要在要驗證的對象上加上@Validated注解,當驗證不通過時會把錯誤結果給到BindingResult中,按照需求給用戶進行提示。

@RequestMapping(value = "/doLogin", method = RequestMethod.POST)
@ResponseBody
public BaseDTO doLogin(@Validated User user, BindingResult bindingResult){
    if (bindingResult.hasErrors()) {
        StringBuilder stringBuilder = new StringBuilder();
        for (FieldError fieldError : bindingResult.getFieldErrors()) {
            stringBuilder.append(fieldError.getDefaultMessage()).append(",");
        }
        stringBuilder.deleteCharAt(stringBuilder.length() - 1);
        throw new UserException(stringBuilder.toString(), 0);
    }
    return null;
}
分組校驗

首先定義一個校驗分組:

public interface ValidGroupLogin {

    //接口中不需要定義任何方法,僅僅是對不同的校驗規(guī)則進行分組
    //此分組只校驗用戶名和密碼

}

先是在bean上設好分組

@NotBlank(message = "{message.username.length}", groups = ValidGroupLogin.class)

然后在controller中使用

@Validated(groups = ValidGroupLogin.class)
國際化

Spring配置:


    
        
        
        
        
        
    

    
    
        
    

    
    
    
        
    

文件所在位置

文件的內容(一份中文,一份英文,一份默認也是中文),其中數(shù)據(jù)校驗也使用的這些個文件
中文:

Title=歡迎
Content=內容
Footer=歡迎捧場
GoHome=前往主頁

message.username.length=用戶名不能為空
message.password.length=密碼要大于等于8位
message.uid.error=參數(shù)錯誤
message.uid.length=參數(shù)長度過長

英文:

Title=Welcome
Content=content
Footer=Welcome to join
GoHome=Go

message.username.length=username must be not null
message.password.length=password more than 8 length must
message.uid.error=param error
message.uid.length=param so long

thymeleaf中可以這樣使用:

文件上傳

老樣子Spring配置:



    
    
        
        
        
        
    

前端:

控制器層:multipartFile就是用戶上傳的文件,MultipartFile[] multipartFiles可以變成多文件上傳。

@RequestMapping(value = "/uploadHeadImage", method = RequestMethod.POST)
@ResponseBody
public BaseDTO uploadHeadImage(@RequestParam("file") MultipartFile multipartFile,
                               @RequestParam(value = "uid") Integer uid) {
        // 保存到指定路徑
        multipartFile.transferTo(orginFile); 
        return null;
}
攔截器

    
        
        
    

攔截器類,繼承HandlerInterceptor:

public class SuperSpringFilter implements HandlerInterceptor {

    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        // 權限校驗,不是所有人都可以操作數(shù)據(jù)庫
        if ("/api/v2/text/checkText".equals(httpServletRequest.getRequestURI())) {
            if (httpServletRequest.getSession().getAttribute("uid").equals(1)) {

            }
        }

        httpServletRequest.setCharacterEncoding("UTF-8");
        return true;
    }

    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        if ("/welcome.html".equals(httpServletRequest.getRequestURI())) {
            httpServletResponse.setDateHeader("Expires", System.currentTimeMillis() + 2000 * 3600);
        }
    }

    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

    }
}

多個攔截器生命周期:

返回JSON數(shù)據(jù)

其實早在之前就用到了,還是配置:






    
        
            
                application/json;charset=UTF-8
            
        
    

    
    
        
            
                
            
        
    

然后再需要返回json的地方加上@ResponseBody注解就可以了

下載

其實吧,直接用HttpServletResponse寫出數(shù)據(jù)流就行了,但既然用了框架,那就來折騰一下:
先在Spring設置一下返回字符串的編碼格式:


        
            
                
                
                
            
        
    

    
    
        
            
                text/html;charset=utf-8
                application/json;charset=utf-8
            
        
    

然后在Controller寫一個下載的方法:

@RequestMapping(value = "/download/{fileName}/", method = RequestMethod.GET)
public ResponseEntity springDownload(@PathVariable String fileName, HttpServletRequest request) {
    String url = request.getSession().getServletContext().getRealPath("/") + "static/" + fileName;

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    headers.setContentDispositionFormData("attachment", fileName);
    try {
        File file = new File(url);
        return new ResponseEntity<>(FileUtils.readFileToByteArray(file), headers, HttpStatus.OK);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}
定時執(zhí)行任務

首先確保類是被Spring掃描得到的(@Componet),然后加上一個@EnableScheduling注解:

@Componet
@EnableScheduling
public class MeiZiTu {

    // 表示每天8點運行一次
    @Scheduled(cron = "0 0 8 * * ?")
    public void upDay() {
        System.out.println("8點啦");
    }
}

一些表達式的例子:

CRON表達式    含義 
"0 0 12 * * ?"    每天中午十二點觸發(fā) 
"0 15 10 ? * *"    每天早上10:15觸發(fā) 
"0 15 10 * * ?"    每天早上10:15觸發(fā) 
"0 15 10 * * ? *"    每天早上10:15觸發(fā) 
"0 15 10 * * ? 2005"    2005年的每天早上10:15觸發(fā) 
"0 * 14 * * ?"    每天從下午2點開始到2點59分每分鐘一次觸發(fā) 
"0 0/5 14 * * ?"    每天從下午2點開始到2:55分結束每5分鐘一次觸發(fā) 
"0 0/5 14,18 * * ?"    每天的下午2點至2:55和6點至6點55分兩個時間段內每5分鐘一次觸發(fā) 
"0 0-5 14 * * ?"    每天14:00至14:05每分鐘一次觸發(fā) 
"0 10,44 14 ? 3 WED"    三月的每周三的14:10和14:44觸發(fā) 
"0 15 10 ? * MON-FRI"    每個周一、周二、周三、周四、周五的10:15觸發(fā) 
使用java類配置Servlet,Spring
@Configuration
public class DruidConfiguration implements WebApplicationInitializer {
    
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        DispatcherServlet servlet = new DispatcherServlet();


    }
    
    @Bean
    public User user() {
        return new User();
    }
}
全局異常捕獲,返回json數(shù)據(jù)

能被包掃描到:

@ControllerAdvice
public class DefaultExceptionHandle {

    private static final Logger logger = LogManager.getLogger(DefaultExceptionHandle.class);
    
    // 通用異常
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public BaseDTO jsonErrorHandler(Exception e) {
        logger.error(e);
        return new BaseDTO(ResultEnums.UNKNOW_ERROR, false);
    }

    // 用戶異常
    @ExceptionHandler(value = UserException.class)
    @ResponseBody
    public BaseDTO makeUserEception(UserException ue) {
        logger.error(ue);
        return new BaseDTO(ue.getStatus(), ue.getMessage(), false);
    }

}
AspectJ支持

Spring AOP 處理Http請求的記錄:
Spring配置文件的使用:


    
    

使用:

@Aspect
@Component
public class HttpAspect {

    private static final Logger logger = LogManager.getLogger(HttpAspect.class);

    // Pointcut表示要切哪個點, *表示所有方法, ..表示任意參數(shù)
    // UserController下的所有方法進行aop攔截,這樣我們可以在方法的聲明周期中執(zhí)行日志記錄。
    @Pointcut("execution(public * com.test.controller.base.UserController.*(..))")
    public void log() {
    }

    // Before表示在方法執(zhí)行之前
    @Before("log()")
    public void before(JoinPoint joinPoint) {
        // 記錄http請求,url,method,client-ip,請求的方法,請求的參數(shù)
        logger.debug("Before=====================");

        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();

        logger.debug("url={}", request.getRequestURL());
        logger.debug("method={}", request.getMethod());
        logger.debug("ip={}", request.getRemoteAddr() + ":" + request.getRemoteHost());

        // 類名
        logger.debug("class_method={}", joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
        // 參數(shù)
        logger.debug("class_args={}", joinPoint.getArgs());
    }

    // After 表示在方法執(zhí)行后
    @After("log()")
    public void after() {
        logger.debug("After===================== 

");
    }

    // 返回的值
    @AfterReturning(returning = "o", pointcut = "log()")
    public void afterReturning(Object o) {
        logger.debug("response={}", o.toString());
    }

}

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67373.html

相關文章

  • 面試題:SpringMVCStruts2的區(qū)別

    摘要:的入口是,而是這里要指出,和是不同的。以前認為是的一種特殊,這就導致了二者的機制不同,這里就牽涉到和的區(qū)別了。開發(fā)效率和性能高于。的實現(xiàn)機制有以自己的機制,用的是獨立的方式。 1、Struts2是類級別的攔截, 一個類對應一個request上下文,SpringMVC是方法級別的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應,所以說從架構本身上SpringMVC...

    isaced 評論0 收藏0
  • 【Java】基于Maven搭建Spring+SpringMVC+Mybatis框架

    摘要:關于的配置,可以參考這篇文章的第一個小節(jié)配置模板引擎搭什么搭直接用腳手架不行嗎下載就能用下載就能用下載就能用碼云咳咳,開個玩笑,如果本著學習態(tài)度的話,那就慢慢啃吧搭建空的項目使用搭建基本的空項目填寫和,,選擇項目的地址,在新的窗口打開最 關于springMVC的配置,可以參考這篇文章的第一個小節(jié):【java】intellij idea SpringMVC 配置FreeMarker模板引...

    edagarli 評論0 收藏0
  • “過時”的SpringMVC我們到底在用什么?深入分析DispatchServlet源碼

    摘要:問題來了,我們到底還在用嗎答案是,不全用。后者是初始化的配置,主要是的配置。啟動類測試啟動項目后,在瀏覽器里面輸入。通過查詢已裝載的,并且支持該而獲取的。按照前面對的描述,對于而言,這個必定是。的核心在的方法中。 之前已經分析過了Spring的IOC(《零基礎帶你看Spring源碼——IOC控制反轉》)與AOP(《從源碼入手,一文帶你讀懂Spring AOP面向切面編程》)的源碼,本次...

    array_huang 評論0 收藏0
  • springMVC流程的學習理解

    摘要:先用一個圖來表示基本流程圖這個網上很容易找到基本流程圖用戶發(fā)送請求到前端控制器前端控制器是的重要部分,位于中心,提供整個框架訪問點,起到交換的作用,而且與容器集成。在配置這個監(jiān)聽器,啟動容器時,就會默認執(zhí)行它實現(xiàn)的方法。 先用一個圖來表示基本流程圖這個網上很容易找到 基本流程圖 showImg(https://segmentfault.com/img/bVbfDiV?w=1340&h...

    didikee 評論0 收藏0
  • [轉載]使用IntelliJ IDEA開發(fā)SpringMVC網站(二)框架配置

    摘要:為了能夠處理中文的請求,再配置一個,以避免請求中文出現(xiàn)亂碼情況至此,配置完畢。一般為一些基本的,用于進行相應的頁面顯示,用于處理網站的請求。現(xiàn)在,需要配置來運行該項目。 摘要講解如何配置SpringMVC框架xml,以及如何在Tomcat中運行轉載請注明出處:Gaussic(一個致力于AI研究卻不得不兼顧項目的研究生)。 注:此文承接上一文:使用IntelliJ IDEA開發(fā)Sprin...

    baukh789 評論0 收藏0
  • Java后端

    摘要:,面向切面編程,中最主要的是用于事務方面的使用。目標達成后還會有去構建微服務,希望大家多多支持。原文地址手把手教程優(yōu)雅的應用四手把手實現(xiàn)后端搭建第四期 SpringMVC 干貨系列:從零搭建 SpringMVC+mybatis(四):Spring 兩大核心之 AOP 學習 | 掘金技術征文 原本地址:SpringMVC 干貨系列:從零搭建 SpringMVC+mybatis(四):Sp...

    joyvw 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<