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"); } }
在访问范围内的网页后:



浙公网安备 33010602011771号