springMVC介绍:
springMVC是一个基于MVC模式的表现层框架,在spring2.5以后增加了注解功能
特点:
1:基于servlet模式
2:控制器不再需要继承其它类,只需要用@Controller注解
3:应用控制器方法参数中由中央控制器负责封装,方法签名定义灵活
4:返回页面直接在方法中指定,可以是String,页可以是其它的
,比如:ModeAndView或void等
5:性能页很优秀
控制器
前端控制器:
前端控制器(DispatcherServlet),负责接收客户端请求,
很具请求路径访问应用控制器负责将页面参数填充javabean,
负责页面转发,对标签类进行调用
应用控制器:
应用控制器(用户书写Controller),负责产生业务组件,调用业务组件的方法完成业务,
根据结果返回转发的页面对象
工作流程
1:当客户端请求服务器,服务器使用前端控制器DispatcherServlet接收请求
2:DispatcherServlet借助HandlerMapping,根据请求的URL路径,定位到具体的Controller,和应用控制器的拘役方法,并将封装号的数据的实体对象传入应用控制器方法
3:由应用控制器方法,完成业务组件的业务方法的调用,然后分局业务方法处理的结果哦,返回需要转发的页面路径,DispatcherServlet根据路径,完成页面转发
添加依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!-- springMVC-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
配置类
@Configuration
@ComponentScan(basePackageClasses = WebApplicationConfig.class)
@EnableWebMvc
public class WebApplicationConfig implements WebMvcConfigurer {
@Autowired
private RequestMappingHandlerAdapter adapter;
@Override
public void extendMessageConverters(
List<HttpMessageConverter<?>> converters) {
StringHttpMessageConverter stringHttpMessageConverter =
(StringHttpMessageConverter) converters.get(1);
stringHttpMessageConverter.setDefaultCharset(
Charset.forName("utf-8"));
}
/**
* 提供静态资源的支持
* @param registry
*/
@Override
@RequestMapping("/register")
public void addResourceHandlers(
ResourceHandlerRegistry registry) {
registry.addResourceHandler("/html/**").
addResourceLocations("classpath:/static/html/");
}
@RequestMapping("/register")
public String registerUser(UserBean user, int price, @RequestParam("name") String userName){
System.out.println(user+" "+price+" "+userName);
return "redirect:/html/info.html";
}
//注册类型转换器
@PostConstruct
public void addConversionConfig() {
ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer) adapter
.getWebBindingInitializer();
if (initializer.getConversionService() != null) {
GenericConversionService converService = (GenericConversionService) initializer.getConversionService();
converService.addConverter(new LocalDateTypeChange());
}
}
}
启动类
public class MainServer2 {
public MainServer2() {
Tomcat tomcat = new Tomcat();
tomcat.setPort(8088);
tomcat.getConnector();
Context context = tomcat.addContext("", null);
try {
//注册前端控制器
DispatcherServlet dispatcherServlet = new DispatcherServlet(
this.createApplicationContext(context.getServletContext()));
Wrapper servlet = tomcat.addServlet(context, "dispatcherServlet", dispatcherServlet);
servlet.setLoadOnStartup(1);
servlet.addMapping("/*");
tomcat.start();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 创建spring容器的应用上下文对象
* @param servletContext WEB容器上下文对象
* @return spring容器应用上下文对象
*/
public static WebApplicationContext createApplicationContext(
ServletContext servletContext) {
AnnotationConfigWebApplicationContext ctx
= new AnnotationConfigWebApplicationContext();
ctx.register(WebApplicationConfig.class);
ctx.setServletContext(servletContext);
ctx.refresh();
ctx.registerShutdownHook();
return ctx;
}
public static void main(String[] args) {
new MainServer2();
}
应用控制器
定义控制器类注解:
@Controller
public classTestController(){
}
控制器方法
@RequestMapping("/abc") //在应用控制器前加上命名空间,可以防止请求URL同名,访问方法的路径为:类的命名空间+方法的请求URL路径
@ResponseBody //表示原样输出
public String add(){
return "执行添加";
}
public String add(){
//重定向到指定
return "redirect://html/info.html " ;
}
得到表单数据
@RequestMapping("/register")
//表单名和属性同名,表单和形参同名,可以直接封装
public String registerUser(UserBean user, int money, @RequestParam("name") String userName){
//表单名和形参不同名,需要指定生命表单封装该属性
System.out.println(user+" "+money+" "+userName);
return "redirect:/html/info.html";
默认值,分页示例:
@Controller //应用控制器
public class StudentController {
@Autowired
private IStudentService service;
@ResultMap("/findAll")
public String findAll(
//如果客户端提交的PageNO为空,将默认值1赋给pageNO这个形参
@RequestParam(value = "pageNO",defaultValue = "1") int pageNO){
return "要返回的参数"
}
应用控制器方法方式
在应用控制器中,可以申明方法只能以某中请求方式进行访问
@RequestMapping(value=“test”)
//该方法只能以GET请求进行访问,
@RequestMapping(method = RequestMethod.GET )
也可以直接是以哦那个@PostMapping, @GetMapping代替@RequestMapping,指定请求方式
应用控制器通过路径得到数据
@RequestMapping("/del/{ss}") //rest风格
public String del(@PathVariable("ss") int studentId) {
service.del(studentId);
return "redirect:/student/findAll";
表示型如:/studdent/del/1这样的路径交由该方法处理,在方法中通过变量接收路径中的数据,赋值非形参setduentId
在应用方法中如果要访问容器中的对象,可以直接在形参中添加request或response
Response响应信息有两种
response.getWriter().print("")向客户端输出文本数据
response。getOutStream()向客户端输出二进制数据
@ResponseBody和@Controller
@Controller一般应用控制器方法做页面跳转,记忆转发,如果要输出具体数据,需要加@ResponseBody
@RestController一般用于具体数据的输出,对字符串数据在客户端原样显示,对实体类对象数据,向客户端输入json格式数据,相当于@Controller和@ResponseBody的结合
向客户端输出对象的json数据
@RequestMapping("testAll")
@ResponseBody
public List<StudentBean> findAll(){
return service.findAll(1).getList();
}