springmvc--spring、springmvc小结--笔记

Spring  中的常用注解

@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 生命这是一个通知类   

作用:把当前类声明为切面类

  • @Before   作用:把当前方法看成是前置通知。属性: value:用于指定切入点表达式,还可以指定切入点表达式的引用。
  • @After  作用:把当前方法看成是始终通知。属性: value:用于指定切入点表达式,还可以指定切入点表达式的引用。
  • @Pointcut 作用:指定切入点表达式 属性: value:指定表达式的内容
  • @AfterReturning 作用:把当前方法看成是后置通知。属性: value:用于指定切入点表达式,还可以指定切入点表达式的引用。
  • @AfterThrowing   作用:把当前方法看成是异常通知。属性: value:用于指定切入点表达式,还可以指定切入点表达式的引用。
  • @Around  作用:把当前方法看成是环绕通知。属性: value:用于指定切入点表达式,还可以指定切入点表达式的引用。

 

SpringMVC常用注解

  @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<pojo> Map  配合@ResponseBody使用

 ResponseEntity   输出json  rest风格

 

Spring--监听器

ContextLoaderListener  在服务器启动之后去初始化spring容器,不再是一个Servlet初始化一次容器!

在web.xml配置  <listener> 标签中配置 ContextLoaderListener  然后使用@ContextConfiguration(value = "classpath:applicationContext.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+"<br/>"+response+"<br/>"+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=””)

  1. value:参数名
  2. required:是否必须,默认为true,标示请求参数中必须包含该参数,如果不包含则抛出异常
  3. defaultValue:默认参数值,如果设置了该值,required=true将失效(即使手动设置了也会失效),自动为false,如果请求中不包含该参数则使用默认值。

不设置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());
	}
  • Pojo对象的绑定

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";

}

页面

<form action="/hello/show24.do" method="post">
		name:<input type="text" name="name" /><br />
		age:<input type="text" name="age" /><br />
		isMarry:<input type="radio" name="isMarry" value="1"/>Y
			<input type="radio" name="isMarry" value="0"/>N<br>
		income:<input type="text" name="income" /><br />
		interests:<input type="checkbox" name="interests" value="bb" />basketball
		<input type="checkbox" name="interests" value="fb" />football
		<input type="checkbox" name="interests" value="vb" />vollyball<br />
		<input type="submit" value="提交" />
	</form>

当自动讲数据封装到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<User>,需要将List对象包装到一个类中才能绑定

pojo包装类

public class UserVO {
	private List<User> users;

	public List<User> getUsers() {
		return users;
	}

	public void setUsers(List<User> 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<Long> ids) {
		model.addAttribute("msg","打印参数:"+ids.toString());
		return "hello";
	}

 

小结

代码优化:

直接编写一个String返回值类型的方法,形参为Model。

返回值默认为视图名称,model可以设置数据。

 

  • 获取常用的servlet内置对象

直接在形参中设置HttpServletRequest、HttpServletResponse、HttpSession用来接收。

  • 占位符:@PathVariable(value=”xx”)

Value属性不能省略:之所以属性省略也可以绑定参数,那是因为eclipse工具帮助我们在编译成class文件时自动添加上去的,一旦换了其他工具,可能时不行了,因此不要省略属性。

接收普通的请求参数:@RequsetParam

Value属性:参数名称

required属性:参数是否必须,默认为true

defaultValue属性:设置参数默认值,一旦设置该属性,required属性自动失效

  • 获取cookie:

直接在形参中通过@CookieValue注解获取cookie中的数据,其属性使用方式和@RequestParam相同

  • 基本数据类型的绑定:

直接在形参中通过@RequestParam注解接收即可

  • 集合的绑定:

    元素为基本数据类型:可以直接通过@Requestparam注解的形参接收

   元素为pojo类型:需要一个pojo对他进行封装

  • Pojo对象的绑定:

直接在形参中定义POJO类型的对象即可自动封装

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值