Spring 相关网站
MVC模型
Model View Controller
超级简单网站制作
- 不用模板返回字符串,在函数最后return 字符串即可
API说明- 最前面用 @Controller 表示是一个网页的入口
- 函数前面 @RequestMapping(path={"路径/{变量}"})
表示网址路径的后缀名,路径中{}包裹的是 @PathVariable 路径变量,可以用在下面的函数中作为参数传递使用 - @ResponseBody 返回字符串时需要,返回模板时不用
- @RequestParam(value = "type",defaultValue = "1",required=false) int type 这是函数传递给网址的参数——也叫请求变量,value表示值的Key,defaultValue表示为空时的值,required表示是否为必须的,false表示可以没有,没有时为NULL,true表示必须要有,否则报错
- 最后一个函数完整的请求网址为
localhost:8080/profile/admin/erika?type=10&id=100
其中type和id都因为required=false而可以省略
@Controller
public class IndexController
{
@RequestMapping(path = {"/", "/index"})
@ResponseBody
public String index()
{
return "Hello AskMe";
}
@RequestMapping(path = {"/profile/{groupname}/{userName}"})
@ResponseBody
public String profileuserID(
@PathVariable("userName") String username,
@PathVariable("groupname") String groupname,
@RequestParam(value = "type",defaultValue = "1",required=false) int type,
@RequestParam(value = "id",defaultValue="10",required = false) Integer id)
{
return String.format("Profile page of %s from %s \n Request for type %d of %d",username,groupname,type,id);
}
}
HTTP Method
写入数据POST 获取数据 GET
- GET
获取接口信息 - HEAD
紧急查看接口HTTP的头 - POST
提交数据到服务器 - PUT
支持幂等性的POST——发多次和成功发一次的效果是一样的,去重版本的POST - DELETE
删除服务器上的资源 - OPITIONS
查看支持的方法
静态和模板文件
这里使用的是Freemaker的模板引擎,所以在HTML中用到变量或者一些语句,必须要按照Freemarker的语法,下面会有简单介绍
-
首先java函数部分的改动
- 不再需要ResponseBody
- 参数中添加 Model型变量,用来给模板传递参数
- model.addAttribute(变量名,变量值) 添加变量,这里添加了字符串变量,List变量,Map变量和自定义的User类型变量
@RequestMapping(path={"/template"},method = {RequestMethod.GET}) public String template(Model model) { model.addAttribute("name","Erika"); List<String> list= Arrays.asList(new String[]{"oasis","blur","the libertines"}); model.addAttribute("band",list); Map<String,String> map=new HashMap<String,String>(); for(int i=0;i<3;i++) map.put(String.valueOf(i+1),list.get(i)); model.addAttribute("map",map); model.addAttribute("user",new User("Erika")); return "home"; }
-
Freemarker基本语法
- 注意这里面表示相等关系是用=而不是==
- 变量引用 ${变量名?if_exists} 如果存在输出,不再就不输出,而不会将该式作为字符串输出
- if 判断
<#if (判断语句)> 你的操作 </#if>
- 遍历list
<#list 你的List变量的名字 as k> ${k} </#list>
这里的遍历是不能continue的但是可以<#break>,如果需要continue可以if,else其中一个设置为空语句来实现continue 的效果
- 遍历map
<#list 你的Map变量的名字?keys as k>
${k}
${Map[k]}
</#list>
- 设置变量或者赋值
<#assign x=10>
- 调用方法或属性(下面两种方法等效)
${user.getDescription()}
${user.description}
- 注释
<#--注释-->
- 字符串连接
<#assign x="${title}+something"
就在双引号中用美元符号和大括号括起来
- 定义函数
<#function 函数名 参数1 参数2 参数3>
<#一些语句>
<#return 返回值>
</#fuction>
${函数名(实参1,实参2,实参3)} <#-- 调用 -->
- 包含其他的html文件
<#include "xxx.html" />
<#import "xxx.html" as a>
这两者有一定的区别,include是将模板直接表示出来,import是导入后继续使用,且如果import的模板中有和当前一样的变量,可以用a.变量名和不加前缀的变量名来区分,但是include就是直接将导入的模板中的值覆盖当前的值,即自己本来的值丢失
IOC
定义类时前面加@service表示是一种服务,在controller中@Autowired 类名 对象名 即可自动创建一个对象,且可以用在任何地方
AOP
面向切面编程,即在定义类的时候表明想在什么地方执行,那在执行某个程序之前之后会自动执行这些切面代码,适合用于日志记录,系统安全等,即不论什么功能什么用户使用都会需要用到的功能适合用面向切面编程,编写方式如下
Before字段表示在执行这些文件路径中的函数之前会执行下面的代码,After同理,这里的代码表示在日志中添加信息,可用通配符*来匹配更多路径更多文件
@Aspect
@Component
public class testaop {
private static final Logger logger= LoggerFactory.getLogger(testaop.class) ;
@Before("execution(* com.erika.askme.controller.IndexController.*(..))")
public void start()
{
logger.info("Before the execution");
}
@After("execution(* com.erika.askme.controller.IndexController.*(..))")
public void end()
{
logger.info("finished");
}
}
Error 处理
@ExceptionHandler()
@ResponseBody
public String error(Exception e)
{
return "error "+e.getMessage();
}
重定向
重定向有两种分别为301,302
301:永久转移 下面代码中将status设为MOVED_PERMANENTLY表示是301
302:临时转移
@RequestMapping(path="/redirect/{code}")
public RedirectView redirect(@PathVariable("code") int code)
{
RedirectView red=new RedirectView("/",true);
if(code==301)
red.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
return red;
}
网友评论