springMVC从头到尾

1.回顾servlet

1.引入依赖:

了解每一个依赖的作用

<!--导入依赖-->
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.9</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>

2.新建一个子工程:

将普通的maven项目转为web项目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UlDNIb8X-1659370263529)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220329000528558.png)]

3.新建Servlet

继承HttpServlet 就是一个servlet,重写方法

public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String method = req.getParameter("method");
        if (method.equals("add")){
            req.getSession().setAttribute("msg","执行add方法");
        }
        if(method.equals("delete")){
            req.getSession().setAttribute("msg","执行delete方法");
        }
        req.getRequestDispatcher("/WEB-INF/jsp/hello.jsp").forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

       doGet(req,resp);
    }
}

4.配置注册servlet ,在web.xml

 主要是要注册servlet
http://localhost:8080/hello?method=add
<servlet>
        <servlet-name>Hello</servlet-name>
        <servlet-class>com.kuang.servlet.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Hello</servlet-name>
        <url-pattern>/hello</url-pattern>  项目后访问的路径
    </servlet-mapping>


    <!--session的超时时间-->
    <session-config>
        <session-timeout>1000</session-timeout>
    </session-config>
    <!--欢迎页面-->
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

在idea中配置idea

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d7WzCsZO-1659370263532)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220329234037654.png)]

如果是web项目,点击fix,会出现以下页面,否则转换web项目失败。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0AAzdGZg-1659370263534)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220329234143667.png)]

2认识springmvc

Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet。

String的web框架,围绕DispatcherServlet,设计,DispatcherServlet的作用是将请求发给不同的处理器。

DispatcherServlet本质也是一个servlet。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-owpEw7A7-1659370263535)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220330234107201.png)]

2.新建项目,了解执行流程

a.新建一个web项目

b.在web文件中配置servlet

​ 注意 springmvc的class是spring的

 <!--配置一个servlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--关联一个spring的配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <!--启动优先级-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

c.配置spring配置文件springmvc-servlet.xml

注:BeanNameUrlHandlerMapping和SimpleControllerHandlerAdapter都是spring提供的

    是配器映射器
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
适配器控制器
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
   试图解析
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
           <property name="prefix" value="/WEB-INF/jsp/"/>
       <property name="suffix" value=".jsp"/>
   </bean>
    <bean id="/hello" class="com.kuang.cotroller.controller"/>

d.添加控制器

   public class controller implements Controller 
@Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView  mav=new ModelAndView();
        mav.addObject("msg","helloMVC");
        mav.setViewName("hello");

        return mav;
    }
}

e.添加jsp文件

f.打包执行测试

3springmvc的执行流程

在这里插入图片描述
前端发起请求,经过DisptcherServlet,前端控制器,分配到HandlerMapping映射器,解析去哪个Controller,回到控制器后分配到HandlerAdaper适配器,经过适配器就找到对应的Controller,经过业务层(业务相关service,数据库,)拿到对modle and view,最后经过试图解析器找到对应的视图,在经过DispatcherServlet,分配渲染。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IVgAb8Ls-1659370263537)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220331195525522.png)]在这里插入图片描述

可能出现的问题:访问出现404,排查步骤

1.查看控制台输出,是否缺少jar

2.如果不缺少jar,显示无法输出,就在idea项目发布中,添加lib依赖

3.重启tomcat

4注解开发mvc

1.新建一个web项目

2.配置web.xml

   和开始的配置相同

<servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class >org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

3.配置spring*.xml

只需要修改扫描包的位置,其他配置将保持不变

    <!--自动扫描包-->
    <context:component-scan base-package="com.kuang.controller"/>
    <!--让spring mvc不处理静态资源-->
    <mvc:default-servlet-handler/>
    <!--是注解生效,且自动帮我们注入 映射器和控制器-->
    <mvc:annotation-driven/>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/"/>
             <property name="suffix" value=".jsp"/>
    </bean>

4.写控制类

@Controller //表示这个类已经被spring管理。
@RequestMapping("springmvc")//第一层请求路径,可以不加
public class HelloController {

    @RequestMapping("/hello")//第二层请求路径,可以不加
    public String getHello(Model model){
        //Model  用来添加数据
        model.addAttribute("msg","helloAnnotation");
        //spring会将hello解析为 请求的jsp。
        return  "hello";
    }

    @RequestMapping("/hello2")
    public String getHello2(Model model){
        model.addAttribute("msg","hello2");
        return  "hello";
    }
}

5.打包测试。

5restFul风格

restFul风格,是一种url访问和后台接收数据的风格。

日常风格,http://localhost:8080/hello?a=2&b=3;

restFul风格:http://localhost:8080/hello/2/3;

这两种风格的请求,都可以根据不同的后台代码实现相同的结果。

同时,这个风格经常会和请求方法一起使用。

在请求的方法中,添加注解@PathVariable,在请求的路径中添加占位符
     @RequestMapping("/add/{a}/{b}")
    public String getHello2(@PathVariable int a, @PathVariable int b, Model model){

        int res = a+b;
        model.addAttribute("msg","结果就是"+res);
        return "hello";
    }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OswyWp4O-1659370263539)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220331215404810.png)]

注意:相同的请求路径,可以根据不同的请求方法,达到不同的后台请求处理

 这方法仅能post请求访问
@RequestMapping(value = "/add2" ,method = RequestMethod.POST)
    public String getHello1(int a, int b, Model model){
        int res = a+b;
        model.addAttribute("msg","结果为"+res);
        return "hello";
    }

也可通过不同的Mapping限制请求的方法:
    @PutMapping
    @GetMapping
    @PostMapping
    @DELETEMapping
    ....

6乱码问题

1.查看tomcat是否设置为utf-8

2.手写拦截器

public class EncodingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

       // servletRequest.setCharacterEncoding("utf-8");
       // servletResponse.setCharacterEncoding("utf-8");
        filterChain.doFilter(servletRequest,servletResponse);

    }

    @Override
    public void destroy() {

    }

3.使用springmvc提供的拦截器:

测试后:如果 /则只要get请求有效

/* get和post请求都有效

 <!--配置过滤,可以自己写,也有springmvc的过滤器-->
    <filter>
        <filter-name>encoding</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>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/</url-pattern>
    </filter-mapping>

7JSON对象

1.引用jackson-databind

  <dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.1</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

2.编写代码

 	  User user = new User("胡歌","hu", 34);
        ObjectMapper objectMapper = new ObjectMapper();
        try {
        String str =    objectMapper.writeValueAsString(user);
        return str;
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }

3.可以将共同的代码部分提取成工具类

   public static  String toJson(Object obj)  {

        return toJson2(obj,"yyyy-MM-dd HH:mm:ss");
    }
    
public static  String toJson2(Object obj,String s)  {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
        SimpleDateFormat sdf = new SimpleDateFormat(s);
        objectMapper.setDateFormat(sdf);

        String str = null;
        try {
            str = objectMapper.writeValueAsString(obj);
            return str;
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }

4.注解解决乱码

@RequestMapping(value = "/js2",produces = "application/json;charset=utf-8")

5.配置文件解决乱码,mvc.xml

   <!--JSON乱码问题配置-->
    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8"/>
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                    <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                        <property name="failOnEmptyBeans" value="false"/>
                    </bean>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

6.使用fastJson

 <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.80</version>
    </dependency>

7.写Java方法,

 		 /**
         * java对象转json对象
         */
		String str = JSON.toJSONString(userList);

        model.addAttribute("msg",str);
        System.out.println("字符串转java");
        /**
         * JSON对象转为java对象
         */
        User usetj = JSON.parseObject(String.valueOf(user),User.class);
        /**
         *java对象转为JSON对象
         */
        JSONObject user2JSon = (JSONObject) JSON.toJSON(user2);

        /**
         * JSON对象转java对象
         */
        User user23 = JSON.toJavaObject(user2JSon,User.class);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值