springmvc基础内容

1.spring集成web环境基本三层架构搭建

(1)在pom文件中需要添加两个坐标

javax.servlet

javax.servlet-api

3.0.1

javax.servlet.jsp

javax.servlet.jsp-api

2.3.1

(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文件中配置全局参数,参数名任意,参数值就是文件名,后期修改配置文件中的文件名即可。

webApplicationLoader

applicationcontext.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坐标,在监听器中配置全局参数)

contextConfigLocation//固定的名字(spring-web提供)

classpath:applicationcontext.xml

org.springframework.web.context.ContextLoaderListener

(2)使用WebApplicationContextUtils调用方法获取Application传入servletcontext

3.springmvc介绍及快速入门

springmvc是一种java实现的mvc设计模式的的请求驱动类型的轻量级web框架,它通过一套注解,让一个简单的java类成为处理请求的控制器,而无需实现任何接口,支持Restful风格的请求。

思考:在servlet中,无非就干几件事:接受请求参数、封装实体、访问业务层、接收返回结果、指派响应页面。是不是每次都是重复的操作?

因此springmvc就将这些共有的行为抽取到一个工具类中提供使用。

springmvc快速入门

开发步骤

(1)导入spring-webmvc坐标

(2)在web.xml配置springmvc前端控制器DispathcerServlet

dispatcherServlet

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

classpath:spring-mvc.xml

1

dispatcherServlet

/

contextConfigLocation

classpath:applicationcontext.xml

org.springframework.web.context.ContextLoaderListener

(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坐标

       

            com.fasterxml.jackson.core

            jackson-core

            2.9.0

       

       

            com.fasterxml.jackson.core

            jackson-databind

            2.9.0

       

       

            com.fasterxml.jackson.core

            jackson-annotations

            2.9.0

       

//使用jackson工具进行转换

            ObjectMapper mapper=new ObjectMapper();

String string=mapper.getWriter().println(实体类);

return string;

使用spring的自带转换工具类RequestMappingHandlerAdapter,只需在springmvc的对应配置文件配置即可自动将实体类转换为json格式的字符串【依赖于jackson】。

   

       

           

               

           

       

   

可以在springmvc.xml文件中配置替换上述配置。【底层自动配置类jackson的配置】

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 list;

}

写jsp页面

   

   

   

   

   

写后端接口

    @RequestMapping("/getList")

    @ResponseBody

    public void test(VO vo) {

        System.out.println(vo);

    }

方式2:使用@RequestBody来接收前端传来的json格式数据

html页面

   

后端接收

    @RequestMapping("/test")

    @ResponseBody

    public void test(@RequestBody List list) {

        System.out.println("hello");

        System.out.println(list);

    }

开放静态资源权限

同时需要在springmvc的xml文件中开放访问资源权限

   

或者可以自己手动设置哪些静态资源可以访问。

11.请求乱码问题

在web.xml配置过滤器解决乱码问题

   

        CharacterEncodingFilter

        org.springframework.web.filter.CharacterEncodingFilter

       

            encoding

            utf-8

       

   

   

        CharacterEncodingFilter

        /*

   

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的配置文件中的中引用转换器,需要配置conversion-service。

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));

    }

你可能感兴趣的:(springmvc基础内容)