一)注解开发SpringMVC
- 注解的开发SpringMVC的第一步第取消使用接口的方式等
- 使用Contorller注解和RequestMapping注解进行注解的开发
-
- Contorller注解:用于表示当前的类为Spring容器管理表示当前的类是一个控制器
- RequestMapping注解:可注解在类体上和方法体上类体上为类的命名空间起到区分不同模块
- 方法体上表示当前方法的访问路径
-
- 3.注解开发需要在SpringMVC的配置文件内设置注解扫描器和注册服务器
- 访问的路径是项目名+控制器的命名空间+方法的具体访问路径
- 重点是访问的路径命名空间+requestMapping(映射路径)
- @Scrop注解表示作用域一般设置取原型模式默认是单态模式
<!--注解注解扫描 扫描指定包下的注解-->
<context:component-scan base-package="com.sxt.handler"></context:component-scan>
<!-- 注册扫描的注解服务 -->
<mvc:annotation-driven/>
<!-- 静态资源放行 -->
<mvc:default-servlet-handler/>
方法体:
@Controller
@RequestMapping("/start")
public class MyHandler {
@RequestMapping("/my")
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
ModelAndView mv = new ModelAndView();
//这对象属性
mv.addObject("msg", "helloWorld");
//设置跳转路径类似请求转发
mv.setViewName("/jsp/hello.jsp");
return mv;
}
- <mvc:annotation-driven/>标签的作用:
-
-
-
- 自动加载HandleMapping处理器映射器和HandlerAdapet处理器适配器
- 支持数据的绑定支持
- 支持Spring注解的支持
- 对XML的读写支持和JSON数据格式的支持
-
-
-
- context:component-scan组件扫描器
-
-
-
- 扫描指定文件下的注解
-
-
-
- 视图解析器、
-
-
-
- 页面跳转的方法是返回值的任意指定
- 页面跳转问题:
- 在进行页面跳转的时候出现问题是如果路径太长的话那么就会返回的字符串问题
- 解决方式:提供的视图解析器、视图解析器是DispatcherServler进行调用的所以在bean上可以不使用指定的ID进行识别
- 视图解析器的真实类名:InternalResourceViewResolver(视图解析器的主要实现类)
- 导入视图解析器的bean
- 添加属性前缀和后缀:
- 使用的属性:
- prefix前缀
- suffix后缀
-
-
-
<!-- 添加视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 对视图解析器的路径太长的问题进行解决 -->
<property name="prefix" value="/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
一)数组参数的接收
- 使用数组的方式接收上传的多个数据
- 使用对象类型的数组进行接接收
@RequestMapping("/skip4")
public String skip4(String[] insertno) {
for (String string : insertno) {
System.out.println(string);
}
return "hello1";
}
- 表单数据
<form action="start/skip4" method="post">
<input type="checkbox" name="insertno" value="a1">a1<br/>
<input type="checkbox" name="insertno" value="a2">a2<br/>
<input type="checkbox" name="insertno" value="a3">a3<br/>
<input type="checkbox" name="insertno" value="a4">a4<br/>
<input type="submit" value="提交"><br/>
</form>
- 使用集合的方式进行接收
-
- 存在一个异常使用@RequesParam进行类型的矫正
-
@RequestMapping("/skip4")
public String skip4(@RequestParam List<String> insertno) {
for (String string : insertno) {
System.out.println(string);
}
return "hello1";
}
一)restful风格传参
- 概念:
-
- restful参数传递的方式是传递的参数是路径变量的一部分进行传递的
- 在requestMapping的映射路径上的使用restful的路径修改成指定的路径格式
-
/{name}/{age}/skip5
- 在方法形参的参数接收的时候使用注解@PathVariable声明该变量是路径变量获取的位置是请求来的路径内(路径变量)
- 方法体:
@RequestMapping("/{name}/{age}/skip5")
public String skip(@PathVariable String name,@PathVariable int age) {
System.out.println(name+"---"+age);
return "hello1";
}
- 在请求的路径上也要按照指定的格式进行值的传入
http://localhost:8080/springmvc-3-annntion/start/user/22/skip5
一)JSON格式的数据的接收
- 使用json串传参数要求要提供三个jackson的jar包
- 使用的到注解@RequestBody注解接收Json格式的数据
![09f4349dc9c1847b9e6a26be5322dcfd.png](https://i-blog.csdnimg.cn/blog_migrate/4867644955a3f5aceed7ca6f4026fb4c.png)
- 使用ajax进行json格式的数据上传
$(function(){
$("#btn1").click(function(){
var data={"username":"zangsan",age:18};
$.ajax({
url:"${pageContext.request.contextPath }/start/scorp",
type:"post",
contentType:"application/json",
data:JSON.stringify(data)
})
});
})
@RequestMapping("/scorp")
public String skip6(@RequestBody User user) {
System.out.println(user);
return "hello1";
}
- 获取请求头的参数
- 获取请求头的的信息需要将@RequestHander注解注解在形参上
-
- 要求形参名称和请求头的名称一致
- 注意:
-
- 1.如果请求的头内没有参数获取的请求信息就会出现异常
- 2.获取的头类型每个形参都要使用@RequestHeader进行注解
-
-
@RequestMapping("/skip8")
public String skip8(@RequestHeader String host,@RequestHeader String connection) {
System.out.println(host+"---"+connection);
return "hello1";
}
- 头信息的获取
<a href="${pageContext.request.contextPath }/start/skip8">请求头信息获取</a>
- handler返回值类型
- 承载数据的对象
- 相当于域对象,在进行适用于String返回类型的时候(String类型适合只进行页面的跳转)
- map存储 存储的方法 put 方法
- Model存储 addAttribute()方法
- ModelMap addAttribute()方法
- 取值使用EL表达式进行值的取出
- 和request域对象的使用相似
- 相当于域对象,在进行适用于String返回类型的时候(String类型适合只进行页面的跳转)
@RequestMapping("/skip9")
public String skip9(String username,String userpass,Map<String, Object> map,Model model,ModelMap map2)
{
map.put("username", username);
model.addAttribute("userpass", userpass);
map2.addAttribute("sex", "男");
return "hello1";
}
响应的注解
- @ResponseBody注解表示返回的数据放在响应体内
- 作用在方法上
- 使用produces属性设置text/html;charset=utf-8设置响应的编码集
- 响应乱码问题
@RequestMapping(value = "/skip10",produces = "text/html;charset=utf-8")
@ResponseBody//表示响应的数据放在请求体内
public String skip10() {
return "china:瓷器";
}
- void 无返回值类型警访问和应用场景
- 1.void返回值类型
- 2.使用HttpServletResponse进行值的返回
- 3.使用流的方式进行返回
- 4.不需要进行数据的返回的时候
- 5.获取参数使用HttpRequestServlet进行获取
@RequestMapping(value = "/skip11",produces = "text/html;charset=utf-8")
@ResponseBody//表示响应的数据放在请求体内
public void skip11(HttpServletResponse response) throws IOException {
//用流的形式进行响应
response.setCharacterEncoding("text/html;charset=utf-8");
response.getWriter().print("china:瓷器");
}
- Obeject的返回
- 使用JSON进行返回值的需要使用@ResponseBoay注解
- 该注解的作用是将返回的格式转换成JSON格式
- 需要使用jackson.jar包的支持
- 底层自动调用jackson进行json格式的数据转换
@RequestMapping(value = "/skip12",produces = "text/html;charset=utf-8")
@ResponseBody//表示响应的数据放在请求体内 并且按照JSON的格式进行转换
public Object skip12() {
//用流的形式进行响应
return "aa";
}