服务端分层:
表现层 业务层 持久层
SpringMvc/Struts Spring Mybatis/Hibernate
SpringMvc采用MVC的设计模式:
model 实体 JavaBean
view 视图 Jsp
controller 控制器 Servlet
Struts2的核心是一个过滤器,而SpringMvc的核心是一个Servlet
----------------------------------------------------------------
(乱总结:spring mvc的运行流程,spring是基于组建来运行的,其中的核心组件是
DispatcherServlet,它作为调度中心来协调各个组件的工作。spring mvc包括前端控制器
处理器映射器、处理器适配器、Controller、视图解析器)
执行流程:前端发来请求到前端控制器,将请求递交到处理器映射器,返回执行链,递交到
处理器适配器,处理器适配器去执行Handler即Controller,Controller返回ModelAndView
然后由视图解析器解析返回视图,数据填充返回响应。
SpringMvc的注解和配置:
1.<!--开启SpringMvc注解的支持-->
<mvc:annotation-driven/>在springMvc的各个组件中,处理器映射器、处理器适配器
视图解析器称为SpringMvc的三大组件。使用这个配置标签后会自动加载这些组件
2.@RequestMapping(path = "/hello")用于建立请求url和处理请求方法之间的对应关系
属性:
3.请求参数的绑定:
a.有一些机制,如果方法的参数名和请求数据名字相同会自动绑定
https://www.kali.com/sss?username=we&password=231
public String query(String username,String password){}
b.对请求的封装
public String query(Account account){}
如果account中包含引用类型要指定account中的属性.属性
c.解决post请求中文乱码问题,使用spring提过的过滤器CharacterEncodingFilter
拦截/*,其中要配置init-param > encoding UTF-8即可
d.集合参数的封装
4.配置解决中文乱码的过滤器
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
5.自定义数据类型转换器
解决日期格式错误导致封装出错的问题
1.定义一个类实现Converter接口,泛型代表接收类型和转换类型
2.配置自定义类型转换器
<!--配置自定义类型转换器-->
<!--配组件-->
<bean id="conversionServiceFactory" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.kali.utils.StringToDateConverter"/>
</set>
</property>
</bean>
<!--开启SpringMvc注解的支持 默认会将映射器适配器视图解析器加载,
但类型转换需要配置生效-->
<mvc:annotation-driven conversion-service="conversionServiceFactory"/>
获取原生的ServletAPI,在控制器中
testServletAPI(HttpServletRequest request, HttpServletResponse response)
常用注解:
@RequestParam解决url中属性与方法接收参数名不符的情况,加在方法参数前
@RequestParam(name = "name",required = false)
@RequestBody针对post请求使用
@PathVariable用于绑定url中的占位符,如:/delete/{id}这个{id}就是url的占位符
@RequestHeader
@CookieValue获取指定cookie的键值
@ModelAttribute可以作用于参数和方法上:出现在方法上,表示当前方法在控制器方法
执行之前,限制性。出现在参数上,将获取的指定的数据给参数赋值
@ModelAttribute注解在方法上,方法的返回值就是它的值:
@ModelAttribute(value = "name")那么方法的返回值就是name的值
@ModelAttribute注解在方法参数上
method(@ModelAttribute(value = "name") String name){
//I should do something!
}就会把name的值传递给这个String类型的name。
@ModelAttribute注解的方法分为两种情况:
1.有返回值的,也会将返回值填充到request域中
@ModelAttribute("u")
public User model(@RequestParam("uname") String name,@RequestParam("uage") int age){
User user = new User();
user.setName(name);
user.setAge(age);
user.setDate(new Date());
System.out.println("有返回值model方法中的" + user);
return user;
}
2.无返回值,不会填充到request域中
@ModelAttribute("xx")
public void model(@RequestParam("uname") String name, @RequestParam("uage") int age, Map<String,User> map){
User user = new User();
user.setName(name);
user.setAge(age);
user.setDate(new Date());
System.out.println("无返回值model方法中的" + user);
map.put("xx",user);
}
@ModelAttribute作用类似Spring的Bean注解
【注】被@ModelAttribute注解的方法会在Controller的每个方法前执行,如果Controller映射到
多个url时,要谨慎使用。而且@ModelAtrribute仅支持一个属性value。他注解的方法返回值会绑定
在request域中。
@SessionAttribute允许我们有选择地指定Model中哪些属性需要存入HttpSession对象中
@SessionAttributes临时性的存储,上面的是永久的存储
@SessionAttributes使用在类上,将model中属性名为"user"的属性放入HttpSession中
方法中需要model.addAttribute("user",user)
存入时需要Model作为方法的参数之一传入,默认填充到request域中
删除:将设置入域中的值删除,方法参数中传入SessionStatus调用setComplete()方法即可清除。
【注】用于多次执行控制器方法之间的参数共享。如果在类上不使用@SessionAttributes注解
将把数据存入到requestScope中,如果使用也将存入到sessionScope中
--------------------------------------------
配置了类型转换器为什么原生支持的类型解析不了了?
--------------------------------------------
WEB-INF目录下的文件访问权限
对于Tomcat服务器而言,WEB-INF是个特殊的目录。这个目录并不属于Web应用程序可以
访问的上下文路径的一部分,对于客户端来说,这个目录是不可见的,不能通过在浏览器
中直接输入地址的方式来访问。但该目录下的内容对于Servlet代码是可见的,
这意味着:要访问WEB-INF目录下的页面,必须通过servlet进入页面,而不能直接访问该页面。
WEB-INF目录下的jsp"不能通过在浏览器中直接输入地址的方式来访问"
当Handler映射的方法是void类型时如何响应呢?
【请求转发方法不会调用视图解析器,需要自己提供转发路径】
1.request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
2.response.sendRedirect(request.getContextPath() + "/response.jsp");
3.使用输出流响应
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer = response.getWriter();
writer.print("你好");
4.使用关键字实现重定向或者转发forward,redirect,使用关键字不能调用视图解析器
return "forward:/WEB-INF/pages/success.jsp";
重定向需要加项目名称的,但这里没写,说明底层做了处理
return "redirect:/response.jsp";
【controller提供的String类型返回值之后,默认就是请求转发】
5.使用ModelAndView作为方法返回值来响应客户端
6.使用ajax发送请求,返回数据。配合@RequestBody拿到数据@ResponseBody来返回响应,
格式为Json数据
需要的jar包
jackson-core.jar
jackson-databind.jar
jackson-annotations.jar
$(function () {
$("#btn").click(function () {
/*contentType的MIME类型*/
//alert("hello!")
$.ajax({
url:"user/testAjax",
contentType:"application/json;charset=UTF-8",
data:'{"name":"haha","age":"15","money":"400"}',
dataType:"json",
type:"post",
success:function (data) {
//data是服务端相应的数据,然后解析
console.log(data.name + " " + data.age + " " + data.money);
}
})
})
});
总结:发送请求到服务端,可以通过返回类型为string的方法返回相应的页面,如果需要返回值
可以绑定在Model对象中,在请求域中获取;也可通过request转发或者response重定向一个返回
页面。对于request和response的使用还可以通过返回一个特定格式的字符串如:
return "forward:/WEB-INF/pages/success.jsp"
return "redirect:/index.jsp"
这两者是不能使用视图解析器的,需要指明路径。
可以使用ModelAndView作为返回值,在model中设置视图和模型。
可以使用ajax发送异步请求,映射方法参数中使用@RequestBody接收,方法返回值为返回类型
在前面加@ResponseBody,对于ajax发送的json格式数据的解析需要jackson相应的jar包。配置
这两个注解后便会自动封装数据到方法参数中,返回也会自动封装为json对象返回。
/*模拟异步请求和响应*/
@RequestMapping(path = "/testAjax")
public @ResponseBody User testAjax(@RequestBody User user){
System.out.println("ajax执行了");
//导入相关jar包,已经将数据封装到对象中
System.out.println(user);
user.setName("we");
System.out.println(user);
return user;
}