springMVC

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();
    }
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页