java框架:spring mvc学习总结

本文详细介绍SpringMVC框架的配置与使用,包括web.xml配置、控制器处理、数据处理、转发与重定向、乱码解决及Restful风格应用。同时,探讨了文件上传、Ajax与JSON交互、拦截器使用和日志配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


是根据B站视频中尚学堂某个老师的视频自学来的,不保证正确,算是自己踩的一些坑.大概是根据那个进行总结了一下.都是比较基础的东西吧.
视频地址


  • web.xml的配置.

: 配置为Servlet,

 <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <!--下面设置为更改默认配置文件,如果不设置这里,那么需要在WEB-INF下面写一个springmvc的配置文件
            默认名字为         servletName-servlet.xml如这里的springmvc-servlet.xml-->
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:mvc.xml</param-value>
        </init-param>
        <!-- load-on-startup定义为1即为应用开始即执行.-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!--这里的url-parrrern我理解为打开springmvc的设置,即只有访问到这里的时候才会运行springmvc.如果设置为根目录,则任何时候都会执行springmvc,然后在springmvc的配置文件里执行查找处理器,渲染等操作.-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

  • 配置springmvc的配置文件.

: 流程大概就是handlermapping处理传进来的url地址并交给控制器进行处理,处理之后的数据交给渲染器,然后返回页面.
有两种方法可以进行配置

  1.使用xml文件配置.
:  第一种方法
```
  <!--配置handler mapping-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--配置handler adapter,根据教程所讲内容,若配置这里springmvc会自动进行适配,若不配置这里,则请求的url地址严格根据名字来进行(包括后缀)-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!--配置渲染器-->
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>
<!--配置接收和处理器-->
<bean name="/hello" class="com.netizen.springmvc.HelloComtroller"></bean>
```

:  第二种方法
```
    <!--第二种配置springmvc的controller的方法,非注解的方法,使用集合,一次性配置多个controller-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
         <props>
             <!--key对应url的请求地址,value为处理器的!! ID !!,这样还需要在外部再写一个bean进行配置.-->
             <prop key="hello.do">HelloController</prop>
         </props>
    </property>
</bean>
<bean id="HelloController" class="com.netizen.springmvc.HelloComtroller"></bean>
```

:  第三种方法
```
<!--第三种配置,URL匹配,这个没太明白,好像是根据Controller的类名字来进行匹配的,不太懂-->
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean>
<!--比如这里的类名字为helloController,那么将自动匹配url为hello*的地址进行处理.-->
<bean id="HelloController" class="com.netizen.springmvc.HelloComtroller">
```


**2.使用注解**

```
<!--添加下列语句自动扫包,然后只配置一个渲染器.-->
       <context:component-scan base-package="com.netizen.springmvc"/>
<!--配置渲染器-->
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>

```

  • 控制器类的填写,请求过来的内容在这里进行处理.
    两种实现方法
    1.不使用注解,对应springmvc不使用注解的配置
    //实现Controller接口,然后重写方法,handleRequest,返回一个ModelAndView实例.
    public class HelloComtroller implements Controller {
      @Override
      public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
          ModelAndView mv = new ModelAndView();
    

// 这里还不是很理解.
mv.addObject(“msg”,“hello,springmvc”);
// 视图名字,在这里设置好之后对应springmvc配置文件里面的前后缀方法,会自动在应用里寻找视图,如这里会寻找/WEB-INF/jsp/hello.jsp.
mv.setViewName(“hello”);
return mv;
}
}

2.使用注解:

//添加Controller注解和RequestMapping()注解进行配置,对应使用注解的springmvc配置.
@Controller
public class HelloC {
// 请求为*.do的时候就会去寻找一个hello的视图去返回.在web.xml里面配置的是当请求在/的时候会调用mvc的框架开始运行和处理.
@RequestMapping("/*.do")
public ModelAndView hello(HttpServletRequest request, HttpServletResponse response){
ModelAndView mv = new ModelAndView();
mv.addObject(“msg”,"annotation springmvc ");
mv.setViewName(“hello”);
return mv;
}
}



----------

- **数据处理和转发**

: 内容比较少,这部分都写在代码里面了,要注意一下return时候的跳转,这是在没有页面渲染器的情况下写的,跳转到的都是index.jsp,因为index在根目录下,这里我感觉不使用渲染器那么就得写绝对路径了,感觉上有点不太方便.
  
  ```
  package com.netizen.springmvc;
  //转发和重定向的方法.
  import ...
  
  @Controller
  public class HelloZF {
      @RequestMapping("/hello1")
      public void hello1(HttpServletRequest request,HttpServletResponse response) throws IOException {
          response.getWriter().println("转发和跳转的实验1");
      }
  // 使用HttpServlet进行重定向
      @RequestMapping("/hello2")
      public void hello2(HttpServletRequest request,HttpServletResponse response) throws IOException {
          response.sendRedirect("index.jsp");
      }
  //使用HttpServlet进行转发
      @RequestMapping("/hello3")
      public void hello3(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
          request.setAttribute("msg","hello3 method");
          request.getRequestDispatcher("index.jsp").forward(request,response);
      }
  
  //    通过springMVC进行转发和重定向----上面的就是普通的Servlet-api的方法.下面这是无视图解析器时候的方法.
      @RequestMapping("/hello4")
      public String hello4(HttpServletRequest request,HttpServletResponse response){
  //这里的return hello,实际上因为有视图解析器的存在会跳到WEB-INF/jsp路径下去寻找..
  //        return "hello";
          System.out.println("request的值为 ---" + request);
          request.setAttribute("msg","index.jsp have been forward");
          return "forward:index.jsp";
  //        return  "redirect:index.jsp";
      }
  //    通过SpringMVC进行转发和重定向 ----有视图解析器的时候.
      @RequestMapping("/hello5")
          public String hello5(){
  //            没节省多少,转发可以少写.重定向的话因为是直接跳到另一个网页上,所以不需要视图解析器.
  //        return "hello";
          return "redirect:index.jsp";
          }
  //        data的获取.可以指定域请求的参数名字,使用@RequestParam注解.
          @RequestMapping("/hello6")
          public String hello6(@RequestParam("uname")String name){
              System.out.println("name的值为 ---" + name);
              return  "index.jsp";
          }
  //从域参数中得到一个实例
          @RequestMapping("/user")
          public String hello7(User user){
              System.out.println(user);
              return "index.jsp";
          }
          @RequestMapping("/hello8")
          public String hello8(@RequestParam("uname")String name, ModelMap mp){
              mp.addAttribute("name",name);
              return "index.jsp";
          }
      }
  
  

  ```
**数据处理的内容还是相对简单的,这里我有一个疑问,就是post的咋办?后边学习应该会讲吧..**

----------

- 乱码的解决和Restful  
:  乱码的解决
  <!--SpringMVC的filter解决乱码的问题.这个方法似乎只能解决post乱码的问题.get乱码通常是因为jsp文件里面pageencoding属性不是utf-8-->
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>CharacterEncodingFilter</param-name>
        <param-value>utf-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/</url-pattern>
</filter-mapping>


:  Restful风格

// restful风格代码的编写,其实是一种从url地址中获得参数的方法,如此不用再写RequestParam
// 注意使用这种方法的时候,如果在web.xml里面定义了打开springmvc的url-pattern,那么需要变化后缀.
@RequestMapping("/hello9/{id}/{uid}")
public String hello(@PathVariable int id,@PathVariable int uid){
// 也可以使用下面这种方式,使用带参的注解,表示将url中id的值传递给了uid
// public String hello(@PathVariable(“id”) int uid,@PathVariable(“uid”) int id)
System.out.println(“id的值为 —” + id);
System.out.println(“uid的值为 —” + uid);
return “index.jsp”;



----------

- 使用commons-fileupload和commons-io包进行文件的上传
:  1.在springMVC的xml文件中配置fileupload的解析器.
  ```
    <!--SpringMVC的filter解决乱码的问题.这个方法似乎只能解决post乱码的问题.get乱码通常是因为jsp文件里面pageencoding属性不是utf-8-->
  <filter>
      <filter-name>CharacterEncodingFilter</filter-name>
      <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
      <init-param>
          <param-name>CharacterEncodingFilter</param-name>
          <param-value>utf-8</param-value>
      </init-param>
  </filter>
  <filter-mapping>
      <filter-name>CharacterEncodingFilter</filter-name>
      <url-pattern>/</url-pattern>
  </filter-mapping>

: 2.编写fileupload的Controller

@Controller
public class fileUploadController {
  @RequestMapping("/upload")
//    需要注意的一点是,这里必须要写 @requestparam(file)
  public String fileupload(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {
//    这里要比较熟悉java的IO才行,还不太熟练。
//        获取上传文件的路径。
      String path = request.getRealPath("/fileupload");
//        因为已经是上传的文件,已经打开了一个写入流。
      InputStream is = file.getInputStream();
//        输出流
      OutputStream os = new FileOutputStream(new File(path,file.getOriginalFilename()));
      int len=0;
      byte[] buffer = new byte[400];
      while((len=is.read())!=-1){
          os.write(buffer,0,len);
      }
      os.close();
      is.close();
      return "index";
  }
}

: 3.编写upload.jsp

<%--
  method必须为post,enctype=multipart/form-data
--%>
  <form action="upload" method="post" enctype="multipart/form-data">
      file:<input type="file" name="file">
      <input type="submit" value="上传">
  </form>

: 4.坑:maven打包,不会打包webapp里面的fileupload文件夹.
没有!
查找了一些资料:
使用plugin 插件
使用插件
不忽略空文件夹
打包到指定文件夹 繁琐一些

以上方法似乎都不可行.我操.
到最后还是部署之后自己在target里创建的文件夹…


  • 进行ajax和json的传递

: 1.使用HttpServlet

@Controller
public class AjaxController {
  @RequestMapping("/ajax")
  public void ajax(String name,HttpServletResponse response) throws IOException {
      response.getWriter().println("123123");
  }

: 2.使用jackson的包和配置文件进行设置.
主要需要注意的是springmvc的配置文件怎么写.视频里的那个类我没找到,百度得到结果是那个类已经不用了,改为使用另一个类,**还有一个说法是使用<!--<mvc:annotation-driven/>**这个东西来进行对json的处理,但是我弄了之后总是报错,我也看不懂错在哪…所以还是使用了替代的类.
配置如下:

          <!--注解的使用打开-->
  <context:component-scan base-package="com.springMVC"></context:component-scan>
      <!--打开json的解析器-->
      <!--<mvc:annotation-driven></mvc:annotation-driven>-->
      <bean id="stringConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
          <property name="supportedMediaTypes">
              <list>
                  <value>text/plain;charset=UTF-8</value>
              </list>
          </property>
      </bean>
  <bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
  <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
      <property name="messageConverters">
          <list>
              <ref bean="stringConverter"></ref>
              <ref bean="jsonConverter"></ref>
          </list>
      </property>
  </bean>
这样返回的结果就是json的对象了,在前端进行处理.
搞不明白各种东西什么情况…json的
参考资料1
参考资料2
参考资料3

  • 关于拦截器

: 视频中讲的很简单…配置一下,实现了三个方法.应该深入一些…

<!--配置拦截器-->
   <mvc:interceptors>
       <mvc:interceptor>
           <mvc:mapping path="/**"/>
           <bean class="com.springMVC.interceptorController"></bean>
       </mvc:interceptor>
   </mvc:interceptors>

: 登陆拦截器,这里比较重要,对我来说有点弯路…
简单点来说就是当在login.jsp中点击submit提交到login之后,本来应该是由UserController来进行处理,查看是否密码正确,如果正确则建立一个session,如果不正确返回到当前页面,现在加入了一个拦截器,作用就是拦截当前界面,查看是否已经登陆,实际上,我认为老师这里讲的不是很清晰,觉得流程应该是当访问一个页面的时候,如果没有用户没有登陆却访问了界面,那么就会被拦截下来,然后跳转到登陆界面,让用户进行登陆,如果访问的网址在允许访问的列表里面,才会接着进行访问,返回true,然后进行用户名密码的判断,如果正确则建立一个session.否则,重新开始.





  • 使用IDEA创建SpringMVC(未使用Maven)
    1.创建时选择SpringMVC,Spring,WebService三个,让idea自动下载包.
    2.下载tomcat,配置好tomcat,包括端口一类的设置.
    3.项目配置(ctrl+shift+alt+s):
    : 导入Tomcat/lib下的servlet-api和jsp-api包,否则会找不到包(我似乎导入了也不能自动给出提示,还需要在类里手动导包,不懂咋回事.)
    : 除此之外,还需要下载jstlstandard这俩包,否则在配置springmvc的时候同样会报错,具体情况不太了解,好像是servlet的xml配置标准根据这个来的.
    : 在WEB-INF下创建classes和lib和jsp三个文件夹.
    1.第一步添加到Lib
    2.第二步
    3.第三步
    4.输出
    如此应该可以运行了.这里配置可能有误,因为我也看不懂,大概是整合了网上了的一些教程吧.

4.结构图.
结构图


使用Maven进行配置了一遍.根据这个教程:
SpringMVC的头文件
SpringMVC indea maven 配置教程
参考资料2
其中碰到的小坑1:需要安装完整的包:jstl jstl-api, standard jstl-impl 这四个都需要在maven里面配置上.
其中碰到的小坑2:自定义设置SpringMVC的xml文件位置的时候,由于maven的限制,不能输出到target里面,参考:maven idea springmvc target
其中碰到的小坑3:把配置文件全部放在了resource文件夹里面,但是输出的时候没有把这个文件夹输出,所以找不到xml和properties文件,注意,放在这里的文件的目录路径就是classpath.所以和放在java的source里面是一样的效果,需要对idea进行设置一下设置方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值