zoukankan      html  css  js  c++  java
  • Spring入门和模板语法

    一、java的工程目录

    pom.xml:工程的依赖包和对工程的说明

    templates:放一些模板

    static:放一些网站需要的静态

    二、网站的简单分层

    controller与service之间,随着工程的变大,会有一个base层

     

     三、简单的测试

    创建一个controller文件

    @Controller:表示这是一个controller

    @RequestMapping:对访问的映射地址进行设置

    @ResponseBody:因为返回的是一个字符串,所以要说明response是一个body

     最后在ToutiaoApplication处进行运行

    网站的地址也可以设置多个:

    @RequestMapping(path = {"/","index"})

    指定参数:

    @PathVariable:表示是@RequestMapping处的参数

    @RequestParam表示是地址?后的参数

    效果图:

     开发的时候,一般使用模板,templates

     

    四、关于使用thymeleaf 模板语言

    详情:https://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#maps

    五、request、response

    1.request

        @RequestMapping(value = {"/request"})
        @ResponseBody
        public String request(HttpServletRequest request,
                              HttpServletResponse response,
                              HttpSession session) {
            StringBuilder sb = new StringBuilder();
            Enumeration<String> headerNames = request.getHeaderNames();         //显示reques中Header
            while (headerNames.hasMoreElements()) {
                String name = headerNames.nextElement();
                sb.append(name + ":" + request.getHeader(name) + "<br>");
            }
    
            for (Cookie cookie : request.getCookies()) {                     //显示cookie
                sb.append("Cookie: ");
                sb.append(cookie.getName());
                sb.append(":");
                sb.append(cookie.getValue());
                sb.append("<br>");
            }
    
            sb.append("getMethod: " + request.getMethod() + "<br>");                   //其他一些内容显示
            sb.append("getPathInfo: " + request.getPathInfo() + "<br>");
            sb.append("getQueryString:" + request.getQueryString() + "<br>");
            sb.append("getRequestURI:" + request.getRequestURL() + "<br>");
            return sb.toString();
        }

    效果图

    2.response

        @RequestMapping(value = {"/response"})
        @ResponseBody
        public String response(@CookieValue(value = "nowcoderid",defaultValue = "a") String nowcoderid,
                               @RequestParam(value = "key",defaultValue = "key")  String key,
                               @RequestParam(value = "value",defaultValue = "value") String value,
                               HttpServletResponse response){
            response.addCookie(new Cookie(key,value));
            response.addHeader(key,value);
            return "Nowcoderid From Cookie: " + nowcoderid;
        }
    response.addCookie(new Cookie(key,value));//会将nowcoderid写入

     六、重定向

    301:永久转移                 //第二次就直接请求服务器的跳转页

    302:临时转移

        @RequestMapping("/redirect/{code}")
        public RedirectView redirect(@PathVariable("code") int code){
            RedirectView red = new RedirectView("/",true);
            if(code == 301){
                red.setStatusCode(HttpStatus.MOVED_PERMANENTLY);          //设置成永久性跳转
    
            }
            return red;
        }

    第二种方法:(永远302跳转)

        @RequestMapping("/redirect/{code}")
        public String redirect(@PathVariable("code") int code){
    
            return "redirect:/";
        }
    
    }

    七、错误处理

        @RequestMapping(value = {"/admin"})
        @ResponseBody
        public String admin(@RequestParam(value = "key", required = false) String key) throws IllegalAccessException {
            if ("admin".equals(key)) {
                return "Hello admin!";
            }
            throw new IllegalAccessException("Key error");
        }
    
        @ExceptionHandler                               //自定义错误处理函数
        @ResponseBody
        public String error(Exception e) {
            return "error: " + e.getMessage();
        }

    效果图

    1.出错页

    2.成功页

     

     

    八、Spring IOP AOP

    参考网站:https://docs.spring.io/spring/docs/current/spring-framework-reference/

    IOP

     例子IOP

    1.创建service文件,ToutiaoService

    @Service
    public class ToutiaoService {
        public String say(){
            return "This is from ToutiaoService.";
        }
    }

    在controller文档使用,我用的是IndexController

     

    2.AOP

    底层其实用的是:Aspectj

    举例:

    1.创建文件LogAspect 

    @Aspect
    @Component
    public class LogAspect {
        private static final Logger logger = LoggerFactory.getLogger(LogAspect.class);
    
        @Before("execution(* com.nowcoder.toutiao.controller.IndexController.*(..))")           //对使用此切面的范围,进行划分
        public void beforeMethod(JoinPoint joinPoint) {
            StringBuilder sb = new StringBuilder();
            for (Object arg:joinPoint.getArgs()){
                sb.append("arg:" + arg.toString() + "|");
            }
            logger.info("before method" + sb.toString());
        }
    
        @After("execution(* com.nowcoder.toutiao.controller.IndexController.*(..))")
        public void afterMethod(JoinPoint joinPoint) {
            logger.info("after method");
        }
    }

    在访问范围内的网页后:

  • 相关阅读:
    TMainMenu 类[三] 手动建立菜单(5) : 给菜单项添加事件
    TMainMenu 类[二] 成员列表
    TMainMenu 类[三] 手动建立菜单(4) : 添加分割线与隐藏多余的分割线
    初学 Delphi 嵌入汇编[30] 寄存器表
    TMainMenu 类[三] 手动建立菜单(6) : 更换菜单
    TMainMenu 类[三] 手动建立菜单(7) : 指定快捷键
    关于网络编程(服务端)的一些笔记 roen的专栏 博客频道 CSDN.NET
    关于 多进程epoll 与 “惊群”问题
    乱谈服务器编程 MrDB 博客园
    再谈select, iocp, epoll,kqueue及各种I/O复用机制 Shallway 博客频道 CSDN.NET
  • 原文地址:https://www.cnblogs.com/zxj-262410/p/10879882.html
Copyright © 2011-2022 走看看