1.spring集成web环境基本三层架构搭建
(1)在pom文件中需要添加两个坐标
(2)在controller层的类中继承HttpServlet重写doGet方法,在方法中写获取getBean来调用接口。
注:配置web环境缺少lib可能报类找不到异常。
原因:tomcat缺少lib环境。
解决方法:点击 properties----->Deployment Assembly----->Add -> Java Build Path Entries -> Next------> Maven Dependencies -> Finish -> Apply -> OK
(3)在webapp的web.xml中配置servlet映射,启动服务即可。
思考:在web环境下不止一个servlet,我们不能每次都创建一个Application来获取bean太浪费性能,那怎么办?
使用监听器:servletContextListener来监听servletContext【web环境下最大的域】,web应用启动时,就会加载spring配置文件,创建应用上下文对象将他存储到最大的域中,这样就能在任意位置获取上下文对象。
对上述问题的改进操作
(1)自定义监听类实现ServletContextListener且实现初始化(获取应用上下文存入web最大的域中)和销毁方法。
ApplicationContextapp=newClassPathXmlApplicationContext("applicationcontext.xml");
ServletContextservletContext=servletContextEvent.getServletContext();
servletContext.setAttribute("app",app);
(2)在web.xml中配置监听(只需要将监听类配置进去即可)(3)获取servletContext中的参数,在获取bean调用方法即可。
思考:这个配置文件名固定死了,如果后期更改了配置文件的名称,那么就需要修改java源代码,进行服务器的重启等操作,严重影响使用,那我们该怎么办?
对上述问题的解决方法
(1)在web.xml文件中配置全局参数,参数名任意,参数值就是文件名,后期修改配置文件中的文件名即可。
(2)从servletContext中取出初始化参数,替换在自定义Listener中原来的固定的文件名即可。
ServletContextservletContext=servletContextEvent.getServletContext();
StringwebApplicationLoader=servletContext.getInitParameter("webApplicationLoader");
ApplicationContextapp=newClassPathXmlApplicationContext(webApplicationLoader);
servletContext.setAttribute("app",app);
思考:如果设置的servletContext的全局作用域的参数名没有记住该怎么办?
我们可以手动封装工具类,传入ServletContext返回Application,只需要调用方法即可。
publicstaticApplicationContextgetWebApplicationContext(ServletContextservletcontext){
returnservletcontext.getAttribute("app");
}
2.Spring集成web环境提供应用上下文工具
spring提供类一个应用上下文加载监听器ContextLoaderListener(在spring-web这个包中),该监听器内部加载spring配置文件,创建应用上下文对象,并存储到servletcontext域中,提供一个客户端工具WebApplicationContextUtils供使用者获取上下文对象。
(1)在web.xml中配置ContextLoaderListener监听器(导入spring-web坐标,在监听器中配置全局参数)
(2)使用WebApplicationContextUtils调用方法获取Application传入servletcontext
3.springmvc介绍及快速入门
springmvc是一种java实现的mvc设计模式的的请求驱动类型的轻量级web框架,它通过一套注解,让一个简单的java类成为处理请求的控制器,而无需实现任何接口,支持Restful风格的请求。
思考:在servlet中,无非就干几件事:接受请求参数、封装实体、访问业务层、接收返回结果、指派响应页面。是不是每次都是重复的操作?
因此springmvc就将这些共有的行为抽取到一个工具类中提供使用。
springmvc快速入门
开发步骤
(1)导入spring-webmvc坐标
(2)在web.xml配置springmvc前端控制器DispathcerServlet
(3)创建Controller和视图页面
(4)使用注解Controller将类的创建权交给spring,并且配置映射@RequestMapping
(5)配置springmvc核心文件spring-mvc.xml
(6)客户端发起请求测试
4.springmvc执行流程
springmvc的相关组件
前端控制器DispatcherServlet:负责调用其他功能组件
处理器映射器HandleMapping:负责地址解析返回执行链
处理器适配器HandleAdapter:被前端控制器调用帮助我们执行处理器
处理器Handle(相当于controller):我们自己封装方法
视图解析器ViewResolver:负责解析出view
视图view:就是显示的页面
①用户发请求到前端控制器DispatcherServlet
②DispatcherServlet收到请求后调用handlerMapping处理器映射器。
③处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet
④DispatcherServlet调用HandlerAdaptor处理器适配器。
⑤handlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)
⑥controller执行完成后返回modelandview
⑦HandlerAdapter将controller执行结果modelandview返回DispatcherServlet
⑧DispatcherServlet将modelandview传给viewResolver视图解析器
⑨viewResolver解析后返回具体的view对象
⑩DispatcherServlet根据view进行渲染视图(即将模型填充到视图),DispatcherServlet响应给用户。
5.springmvc的注解
@RequestMapping
作用:用于建立请求url和处理请求方法之间的对应关系
属性:
value:设置请求地址,只设置这一个属性时可省略。
method:设置请求方式
params:设置请求时必须携带的请求参数。
6.xml配置文件组件扫描可以设置具体扫描哪些,不扫哪些
扫描某包下的固定的注解。例:扫描itcast下的controller注解
扫描某包下排除某注解的其他注解。例:排除itcast下的controller注解
7.获取pojo类型参数
controller中业务方法的pojo参数属性名与请求参数名字保持一致,参数值就会自动匹配。
例如:url地址为:http://localhost/hello?username=zs&age=23
实体类user就包含这两个属性,因此在controller的方法中的参数位置直接写User就会自动把url传来的值封装到user中。
8.springmvc组件解析及xml文件配置
返回视图时,可以加forword(转发)和redirect(重定向)
//这是转发跳转到hello.jsp,但地址栏不发生变化
public String save() {
System.out.println("controller Running....");
return "forward:/hello.jsp";
}
//这是重定向跳转到hello.jsp,地址栏发生变化,变成。。。/hello.jsp
public String save() {
System.out.println("controller Running....");
return "redirect:/hello.jsp";
}
配置内部资源视图解析器
视图跳转时,可以省略前缀/jsp/和后缀.jsp
9.springmvc数据响应
数据响应方式
1.页面跳转(1)返回字符串形式(2)返回modelandview形式
2.数据回写(1)返回字符串形式(2)返回对象或集合
数据响应方式的详解
①页面跳转:返回字符串方式
此种方式会将返回字符串与视图解析器的前后拼接后跳转。
注:重定向的页面必须处于可以被访问的文件夹下,不能在WEB-INF下,因为WEB-INF受保护。
②页面跳转:返回modelandview
形式1:创建modelAndView
public ModelAndView save2() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("/WEB-INF/jsp/hello.jsp");
modelAndView.addObject("name","itcast");
return modelAndView;
}
设置视图时,路径从webapp以下开始列出。【可以配置viewResolver的前缀和后缀】
形式2:ModelAndView作为参数
@RequestMapping("/third")
public ModelAndView save3(ModelAndView modelAndView) {
modelAndView.addObject("addr","河南南阳");
modelAndView.setViewName("third.jsp");
return modelAndView;
}
//设置model,返回字符串【即页面】
@RequestMapping("/four")
public String save4(Model model) {
model.addAttribute("age","18");
return "third.jsp";
}
形式3:HttpServletRequest作为参数【不常用】
@RequestMapping("/five")
public String save5(HttpServletRequest httpServletRequest) {
httpServletRequest.setAttribute("name", "张三");
return "third.jsp";
}
③回写数据:直接回写字符串
web阶段,使用response.getWrite().print("hello world")进行回写数据;
方式1:参数写HttpServletResponse返回值为void
@RequestMapping("/six")
public void save6(HttpServletResponse httpServletResponse) throws IOException {
httpServletResponse.getWriter().println("hello");
}
方式2:使用@ResponseBody标识 返回的字符串 不进行跳转。
@RequestMapping("/seven")
@ResponseBody
public String save7() {
return "返回数据";
}
方式3:回写数据返回对象或集合【json格式】
使用jackson工具进行转换。
//导入jaskson坐标
//使用jackson工具进行转换
ObjectMapper mapper=new ObjectMapper();
String string=mapper.getWriter().println(实体类);
return string;
使用spring的自带转换工具类RequestMappingHandlerAdapter,只需在springmvc的对应配置文件配置即可自动将实体类转换为json格式的字符串【依赖于jackson】。
可以在springmvc.xml文件中配置
10.springmvc获取请求数据
请求数据类型
(1)基本数据类型(2)pojo类型(3)数组类型(4)集合类型
获取基本数据类型参数
例如:http://localhost:8080/getData?username=zhangsan&age=18
@RequestMapping("/getData")
@ResponseBody
public void test(String username,int age) {
System.out.println("username=" + username);
System.out.println("age=" + age);
}
获取pojo类型
地址栏传递的参数是封装实体类的部分/全部属性,在方法中将实体类作为参数。此时地址栏传来的值就会直接封装到实体对象中。
例:http://localhost:8080/getUser?name=zhangsan&age=18
@RequestMapping("/getUser")
@ResponseBody
public void test(User user) {
System.out.println(user);
}
获取数组类型参数
地址栏传递参数的键相同且用&连接或者。方法用数组接收即可自动封装。
例:http://localhost:8080/getArray?age=19&age=18
@RequestMapping("/getArray")
@ResponseBody
public void test(String [] age) {
System.out.println(Arrays.asList(age));
}
获取集合类型参数
方式1:接收集合石可以封装vo对象接收
封装vo【valueObject】对象,嵌套实体类对象来自动获取vo对象。
VO对象:生成构造、set、get方法。
public class VO {
private List
}
写jsp页面
写后端接口
@RequestMapping("/getList")
@ResponseBody
public void test(VO vo) {
System.out.println(vo);
}
方式2:使用@RequestBody来接收前端传来的json格式数据
html页面
$(function () {
var userList = new Array();
userList.push({name: "zhangsan", age: 18});
userList.push({name: "lisi", age: 24});
$.ajax({
url: "http://localhost:8080/test",
type: "post",
data: JSON.stringify(userList),
contentType: "application/json"
})
})
后端接收
@RequestMapping("/test")
@ResponseBody
public void test(@RequestBody List
System.out.println("hello");
System.out.println(list);
}
开放静态资源权限
同时需要在springmvc的xml文件中开放访问资源权限
或者可以自己手动设置哪些静态资源可以访问。
11.请求乱码问题
在web.xml配置过滤器解决乱码问题
12.参数绑定注解@RequestParam
形参为name,我们使用@RequestParam("username")
在地址栏传值时输入(http://localhost:8080/test2?username=张三)即可赋值给形参name
@RequestMapping("/test2")
public void test(@RequestParam("username") String name) {
System.out.println(name);
}
@RequestParam的属性:value、required、defaultValue
required默认为true,意思是该参数必填,不填就报错
defaultValue:没有指定(请求参数)时使用默认值。例:(http://localhost:8080/test2)
13.Restful风格
Restful是一种客户端与服务端接口交互的一种约定风格。
get:获取 put:更新 delete:删除 post:新增
使用@PathVariable标记请求的参数username
请求地址:http://localhost:8080/user/张三
@RequestMapping("/user/{username}")
public void test3(@PathVariable("username") String userneme) {
System.out.println(userneme);
}
14.自定义类型转换器
spring已经提供了一些默认的类型转换器,例如:String转为int。客户端提交过来时都是String类型的数据。
但不是所有的类型都能自动转换,没有的我们就需要自定义。例如“日期类型我们就要自定义
自定义类型转换器开发步骤:
①定义转换器类实现convert<需要被转换的类型,转换成的类型>接口
public class DateConvert implements Converter
public Date convert(String s) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = simpleDateFormat.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
②在springmvc的配置文件中声明转换器(ConversionServiceFactoryBean)里面注入的时自定义的转换器类
③在springmvc的配置文件中的
15.springmvc获取servlet的api对象
在形参的位置写HttpServletRequest、HttpServletResponse、Httpsession即可,session也可通过request获取。
16.spring获取请求头信息
@RequestHeader可以获取请求头信息
两个属性:value:指定请求头名称
required:是否必须携带此请求头
@RequestMapping("/test5")
@ResponseBody
public void test5(@RequestHeader(value = "User-Agent") String user_agent) {
System.out.println(user_agent);
}
@CookieValue获取指定名称cookie的值
两个属性:value:指定cookie名称
required:是否必须携带此请求头
17.springmvc文件上传
客户端实现:(1)type=“file”(2)提交方式为post(3)enctype为多表单形式。
文件上传原理:
(1)当文件的form修改为多部分表单时,request.getParameter()将失效。
(2)enctype=“application/x-www-form-urlencoded”时,form表单的正文内容是:key=value&key=value键值对形式。
(3)当form表单的enctype取值为mutilpart/form-data时,请求内容变成多部份形式:
服务端实现:
(1)导入fileupload(commons-fileupload)和io坐标(commons-io)
(2)配置文件上传解析器(声明commonsMutipartResolver的bean在里面配置)
注:必须写id,否则后端获取不到值。
(3)编写文件上传代码
@RequestMapping("/upload")
@ResponseBody
public void update(String name, String password, MultipartFile multipartFile) throws IOException {
String originalFilename = multipartFile.getOriginalFilename();
multipartFile.transferTo(new File("c:\\upload\\"+originalFilename));
}