@Configuration 声明这是一个配置类
@ComponentScan("cn.bufanli") 配置注解包扫描 放到配置类上
@Import(value = { JdbcConfig.class }) 引入其他类到配置类中
@PropertySource(value={"classpath:jdbc.properties"}) 加载外部配置文件
@Bean("指定id一般是返回值") 将方法对象配置到容器当中
@Value("${jdbc.url}") 作用: 注入基本数据类型和String类型数据的 属性: value:用于指定值
@Qualifier 作用: 在自动按照类型注入的基础之上,再按照Bean的id注入。它在给字段注入时不能独立使用,必须和@Autowire一起使用;但是给方法参数注入时,可以独立使用。属性: value:指定bean的id。
@Resource 作用: 直接按照Bean的id注入。它也只能注入其他bean类型。属性: name:指定bean的id。
@Aspet 生命这是一个通知类
作用:把当前类声明为切面类。
@Controller 标记一个普通的bean是一个Controller
@ResponseBody 将方法的返回值,序列化为json
@RestController 相当于@Controller + @ResponseBody
//接受参数类型
@RequestMapping 配置请求路径
@PathVariable 接收占位符参数
@RequestParam (value,required,defaultValue)value:接收普通参数,required:如果参数为空抛出异常,defaultValue:设置默认值,如果请求中不包含该参数,使用默认值required会失效
@CookieValue 获取cookie中的参数
@ResponseStatus 设置返回响应码
//方法返回值类型
ModelAndView Model 数据模型 View 数据名称
String 默认视图名称 forward:转发 redirect:重定向
void 配合@ResponseStatus使用
pojo List
ResponseEntity 输出json rest风格
Spring--监听器
ContextLoaderListener 在服务器启动之后去初始化spring容器,不再是一个Servlet初始化一次容器!
在web.xml配置
SpringMVC
1、 模型(Model)(业务层对象、封装数据的bean、持久层对象):
负责封装应用的状态,并实现应用的功能。通常分为数据模型和业务逻辑模型,数据模型用来存放业务数据,比如订单信息、用户信息等;而业务逻辑模型包含应用的业务操作,比如订单的添加或者修改等。通常由java开发人员编写程序完成,代码量最多
2、 视图(View):视图通过控制器从模型获得要展示的数据,然后用自己的方式展现给用户,相当于提供界面来与用户进行人机交互。通常由前端和java开发人员完成,代码量较多。
3、 控制器(Controller):用来控制应用程序的流程和处理用户所发出的请求。当控制器接收到用户的请求后,会将用户的数据和模型的更新相映射,也就是调用模型来实现用户请求的功能;然后控制器会选择用于响应的视图,把模型更新后的数据展示给用户。起到总调度的作用,Controller通常由框架实现,使用时基本不需要编写代码
springMVC可以使用简单注解使一个普通的类成为一个可以接受http数据的请求处理器
支持RESTF风格的请求方式,RESTF风格使请求更加明细话查询GET,POST,put,delete,update
返回指定状态码更加精确化,post请求创建资源成功返回201
springMVC核心是DispatchServlet就是一个servlet相当与一个控制器用于负责拦截请求,请求分发
发送到每一个处理器上
SpringMVC执行流程:
客户端发送Http请求到DispatchServlet前段控制器控制器调用映射器通过url来确定有没有指定的Controller存在,
映射器会返回一个执行链(包含了Controller和一个拦截器集合)给DispatchServletDispatchServlet会调用一个合适适配器,接下来适配器去调用Controller去处理业务逻辑,返回一个ModelAndView(封装了数据和视图名称)到前端控制器前段控制器去调用试图解析器解析视图(通过指定的视图名称去指定存放页面的位置去找指定的视图(也就是前端页面)),将数据添加到真正的视图上返回给前段控制器然后返回给客户端!
接收数据及数据绑定
接收servlet的内置对象
@RequestMapping(value="show17")
public String test17(Model model,HttpServletRequest request,HttpServletResponse response,HttpSession session){
model.addAttribute("msg", request+"
"+response+"
"+session);
return "hello";
}
接收占位符请求路径中的参数
@PathVariable(value=”id”)获取占位符中的参数
注意:注解中的(value=”id”)可以省略,但是千万不要省。
代码:在@PathVariable()没有设置参数名称,也能接收参数。注意:一定要做注解中设置参数名称
@@RequestMapping(value="show18/{name}/{id}")
public String test18(Model model,@PathVariable("name")String name,@PathVariable("id")String id){
model.addAttribute("msg", "接收到的参数为:"+name+"..."+id);
return "hello";
}
接收普通的请求参数
@RequestParam(value=””, required=true/false, defaultValue=””)
不设置required属性,那么默认就必须要提交参数name,不提交参数name:报400参数列表错误,因此如果不配置required属性,默认就是true,即必须传递name参数。只有当手动设置required为false时,才可以不用传递参数:
@RequestMapping(value="show19")
public String test19(Model model,@RequestParam(value="name")String name){
model.addAttribute("msg", "使用@RequestParam接收到的参数为:"+name);
return "hello";
}
如果设置了defaultValue属性,那么表示可以不用传递参数,一旦不传递参数,就使用默认值。结论:只要配置了defaultValue属性,required属性就失效了。
@RequestMapping(value="show20")
public String test20(Model model,@RequestParam(value="name",defaultValue="lisi")String name){
model.addAttribute("msg", "使用@RequestParam接收到的参数为:"+name);
return "hello";
}
@RequestParam和@PathVariable的区别:
@RequestParam比之@PathVariable的区别是不需要在注解中使用占位符{xxx}
获取cookie参数
使用注解方式获取cookie就比传统方式就简单的多。
@CookieValue使用方法同@RequestParam
代码:注意@CookieValue("JSESSIONID")必须大写,当cookie中没有该属性时,可以设置一个默认值:
@RequestMapping(value = "show22")
public String test22(Model model, @CookieValue("JSESSIONID",defaultValue="101")String jsessionid) {
model.addAttribute("msg", "jsessionid:" + jsessionid);
return "hello";
}
字符串、整型、浮点型、布尔型、数组。
需求:通过一个页面提交某些数据,由自定义处理器获取这些数据并打印到控制台,但是不需要响应任何页面。
@ResponseStatus(value=HttpStatus.OK):如果不响应页面,就需要响应状态。
在自定义处理器中添加一个请求方法:
@RequestMapping(value = "show23")
@ResponseStatus(value=HttpStatus.OK)//不响应页面,就需要响应个状态码
public void test23(@RequestParam("name")String name,
@RequestParam("age")Integer age,
@RequestParam("isMarry")Boolean isMarry, //可以将on或者1转换为true,0转换为false.
@RequestParam("income")Float income,
@RequestParam("interests")String[] interests) {
StringBuffer sb = new StringBuffer();
sb.append("name:"+name+"\n");
sb.append("age:"+age+"\n");
sb.append("isMarry:"+isMarry+"\n");
sb.append("income:"+income+"\n");
sb.append("interests:[");
for (String inter : interests) {
sb.append(inter+" ");
}
sb.append("]");
System.out.println(sb.toString());
}
SpringMVC会将请求参数名和POJO实体中的属性名(set方法)进行自动匹配,如果名称一致,将把值填充到对象属性中,并且支持级联(例如:user.dept.id)。
pojo类
public class User {
private String name;
private Integer age;
private Boolean isMarry;
private Float income;
private String [] interests;
}
处理器
@RequestMapping(value="show24")
public String test24(Model model,User user) {
model.addAttribute("msg",user);
return "hello";
}
页面
当自动讲数据封装到User对象中之后,如果还想单独获取某个或几个参数,可以单独设置形参获取。
@RequestMapping(value="show24")
public String test24(Model model,User user,@RequestParam(value="name")String name) {
model.addAttribute("msg","打印参数:"+user+"..."+name);
return "hello";
}
如果List中封装的是pojo对象,不能够直接在方法中形参中使用List
pojo包装类
public class UserVO {
private List users;
public List getUsers() {
return users;
}
public void setUsers(List users) {
this.users = users;
}
@Override
public String toString() {
return "UserVO [users=" + users + "]";
}
}
处理器
@RequestMapping(value="show25")
public String test25(Model model,UserVO userVO) {
model.addAttribute("msg","打印参数:"+userVO.toString());
return "hello";
}
处理器
@RequestMapping(value="show26")
public String test26(Model model,@RequestParam("ids")List ids) {
model.addAttribute("msg","打印参数:"+ids.toString());
return "hello";
}
小结
代码优化:
直接编写一个String返回值类型的方法,形参为Model。
返回值默认为视图名称,model可以设置数据。
直接在形参中设置HttpServletRequest、HttpServletResponse、HttpSession用来接收。
Value属性不能省略:之所以属性省略也可以绑定参数,那是因为eclipse工具帮助我们在编译成class文件时自动添加上去的,一旦换了其他工具,可能时不行了,因此不要省略属性。
接收普通的请求参数:@RequsetParam
Value属性:参数名称
required属性:参数是否必须,默认为true
defaultValue属性:设置参数默认值,一旦设置该属性,required属性自动失效
直接在形参中通过@CookieValue注解获取cookie中的数据,其属性使用方式和@RequestParam相同
直接在形参中通过@RequestParam注解接收即可
元素为基本数据类型:可以直接通过@Requestparam注解的形参接收
元素为pojo类型:需要一个pojo对他进行封装
直接在形参中定义POJO类型的对象即可自动封装