springmvc学习笔记加心得

1、在web.xml中配置核心控制器

<servlet>
  <servlet-name>dispatcherServlet</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>dispatcherServlet</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

2.在web.xml中配置中文乱码过滤器

<filter>
  <filter-name>characterEncodingFilter</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>
</filter>
<filter-mapping>
  <filter-name>characterEncodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

3.springmvc的xml配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 开启注解扫描 -->
    <context:component-scan base-package="cn.xmz"/>

    <!-- 视图解析器对象 -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

<!--    配置自定义类型转换器-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="cn.xmz.utils.StringToDateConverter"/>
            </set>
        </property>
    </bean>


    <!-- 开启SpringMVC框架注解的支持 -->
    <mvc:annotation-driven conversion-service="conversionService"/>

</beans>

4.相关注解的使用

/**
 *  属性:
 *      path和value一样
 *      method设置请求方式
 *      params指定限制请求参数的条件,支持简单的表达式,请求参数的key和value必须和配置的一模一样
 *      headers:限制请求头的条件
 * @return
 */
@RequestMapping(path = "/testRequestMapping",method = {RequestMethod.POST},
        params = {"username","password=123"},headers = {"Accept"})
public String testRequestMapping(){
    System.out.println("测试RequestMapping");
    return "success";
}
@Controller
@RequestMapping("anno")
@SessionAttributes(value = {"msg"})//吧msg=美美存到session域中
public class AnnoController {

    /*RequestParam的required属性默认开启*/
    @RequestMapping("/testRequestParam")
    public String testRequestParam(@RequestParam(name = "name",required = true) String username){
        System.out.println("anno/testRequestParam");
        return "success";
    }

    @RequestMapping("/testRequestBody")
    public String testRequestBody(@RequestBody String body){
        System.out.println("anno/testRequestBody");
        System.out.println(body);
        return "success";
    }

    @RequestMapping("/testPathVariable/{sid}")
    public String testPathVariable(@PathVariable(name = "sid") String id){
        System.out.println("anno/testPathVariable/10");
        System.out.println(id);
        return "success";
    }

    /*获取请求头信息*/
    @RequestMapping("/RequestHeader")
    public String testRequestHeader(@RequestHeader(value = "Accept") String header){
        System.out.println("anno/RequestHeader");
        System.out.println(header);
        return "success";
    }

    /*获取cookie内容*/
    @RequestMapping("/testCookieValue")
    public String testCookieValue(@CookieValue(value = "JSESSIONID") String cookieValue){
        System.out.println("anno/testCookieValue");
        System.out.println(cookieValue);
        return "success";
    }

    /**/
    @RequestMapping("/testModelAttribute")
    public String testModelAttribute(@ModelAttribute("abc") User user){
        System.out.println("anno/testModelAttribute");
        System.out.println(user);
        return "success";
    }

    /*该方法会先执行,方式一*/
//    @ModelAttribute
    public User showUser(){
        User user = new User();
        user.setId("1");
        user.setName("1");
        user.setPassword("1");
        System.out.println("showUser");
        return user;
    }
    /*该方法会先执行,方式二*/
    @ModelAttribute
    public User showUser(Map<String, User>map){
        User user = new User();
        user.setId("1");
        user.setName("1");
        user.setPassword("1");
        map.put("abc",user);
        System.out.println("showUser");
        return user;
    }

    /*
    model设置
    ModelMap 取
    SessionStatus.setComplete清除session
    * */
    @RequestMapping("/testSessionAttributes")
    public String testSessionAttributes(Model model, ModelMap modelMap, SessionStatus status){
        System.out.println("anno/testSessionAttributes");
        /*底层会存储到request域对象中*/
        model.addAttribute("msg","美美");
        String msg = (String)modelMap.get("msg");
        System.out.println(msg);
        status.setComplete();
        return "success";
    }
}

5.controller中方法的返回值

@RequestMapping("testString")
    public String testString(Model model){
        System.out.println("testString");
        User user  = new User();
        user.setId(1);
        user.setUsername("美美");
        user.setPassword("123456");
        model.addAttribute("user", user);
        return "success";
    }

    /*无返回值默认请求/WEB-INF/pages/user/testVoid.jsp
    * 可以使用HttpServletRequest进行请求转发
    * */
//    @RequestMapping("testVoid")
//    public void testVoid(Model model){
//        System.out.println("testVoid");
//    }
    @RequestMapping("testVoid")
    public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception{
        System.out.println("testVoid");
        /*转发*/
//        request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);

        /*重定向*/
//        response.sendRedirect(request.getContextPath()+"/WEB-INF/pages/success.jsp");

        /*设置中文乱码*/
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        /*直接响应*/
        response.getWriter().print("hello 世界");
    }

    @RequestMapping("testModelAndView")
    public ModelAndView testModelAndView(){
        System.out.println("testModelAndView");
        ModelAndView mv = new ModelAndView();
        User user  = new User();
        user.setId(1);
        user.setUsername("小明");
        user.setPassword("123456");
        /*会把user存入到request*/
        mv.addObject("user",user);
        /*跳转页面*/
        mv.setViewName("success");
        return mv;
    }

    @RequestMapping("testForwardOrRedirect")
    public String testForwardOrRedirect(){
        System.out.println("testForwardOrRedirect");
        /*转发*/
//        return "forward:/WEB-INF/pages/success.jsp";
        return "redirect:/index.jsp";
    }

//    @RequestMapping("testAjax")
//    public void testAjax(@RequestBody String body,HttpServletRequest request, HttpServletResponse response) throws Exception{
//        System.out.println("testAjax");
//        System.out.println(body);
//        /*设置中文乱码*/
//        response.setCharacterEncoding("UTF-8");
//        response.setContentType("text/html;charset=UTF-8");
//
//        /*直接响应*/
//        response.getWriter().print(body);
//    }
    @RequestMapping("testAjax")
    public @ResponseBody User testAjax(@RequestBody User user){
        System.out.println("testAjax");
        System.out.println(user);
        user.setId(10);
        return user;
    }

6.异常处理

<!--配置异常处理器-->
<bean id="sysExceptionResolver" class="cn.xmz.exception.SysExceptionResolver"></bean>
@RequestMapping("/testException")
public String testException() throws SysException{
    System.out.println("testException执行了");
    /*快捷键ctrl+alt+t,对选中代码块进行操作,如try catch*/
    try {
        int a =10/0;
    } catch (Exception e) {
        e.printStackTrace();
        throw new SysException("查询所有用户出现错误");
    }
    return "error";
}
private String message;

@Override
public String getMessage() {
    return message;
}

public void setMessage(String message) {
    this.message = message;
}

public SysException(String message) {
    this.message = message;
}
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest,
                                     HttpServletResponse httpServletResponse, Object o, Exception e) {
    //获取异常对象
    SysException se = null;
    if(e instanceof SysException){
        se = (SysException) e;
    }else {
        se = new SysException("系统正在维护");
    }
    /*创建ModelAndView*/
    ModelAndView mv = new ModelAndView();
    mv.addObject("errorMsg", se.getMessage());
    mv.setViewName("error");
    return mv;
}

7.文件上传

<!--配置文件解析器-->
<!--id="multipartResolver"这个是必须的-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="10485760"></property>
</bean>
<h3>传统文件上传</h3>
<form action="/file/upload1" method="post" enctype="multipart/form-data">
    选择文件:<input type="file" name="upload1">
    <input type="submit" value="上传">
</form>

<h3>springmvc文件上传</h3>
<form action="/file/upload2" method="post" enctype="multipart/form-data">
    选择文件:<input type="file" name="upload2">
    <input type="submit" value="上传">
</form>

<h3>跨服务器文件上传</h3>
<form action="/file/upload3" method="post" enctype="multipart/form-data">
    选择文件:<input type="file" name="upload3">
    <input type="submit" value="上传">
</form>
@RequestMapping("/upload1")
public String fileUpload1(HttpServletRequest request) throws Exception {
    System.out.println("传统文件上传");
    String path = request.getSession().getServletContext().getRealPath("/uploads");
    System.out.println(path);
    File file = new File(path);
    /*判断路径是否存在*/
    if(!file.exists()){
        /*创建新文件夹*/
        file.mkdirs();
    }
    /*解析request对象,获取上传文件项*/
    DiskFileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);
    List<FileItem> items = upload.parseRequest(request);
    for (FileItem item:items){
        if(item.isFormField()){
            /*普通表项*/
        }else{
            /*文件项*/
            String filename = item.getName();
            /*uuid*/
            String uuid = UUID.randomUUID().toString().replace("-", "");
            filename = uuid+filename;
            item.write(new File(path, filename));
            item.delete();
        }
    }
    return "success";
}

@RequestMapping("/upload2")
public String fileUpload2(HttpServletRequest request, MultipartFile upload2) throws Exception {
    System.out.println("springmvc文件上传");
    String path = request.getSession().getServletContext().getRealPath("/uploads");
    System.out.println(path);
    File file = new File(path);
    /*判断路径是否存在*/
    if(!file.exists()){
        /*创建新文件夹*/
        file.mkdirs();
    }
    String filename = upload2.getOriginalFilename();
    /*uuid*/
    String uuid = UUID.randomUUID().toString().replace("-", "");
    filename = uuid+filename;
    upload2.transferTo(new File(path, filename));
    return "success";
}

/*跨服务器上传*/
@RequestMapping("/upload3")
public String fileUpload3(HttpServletRequest request, MultipartFile upload3) throws Exception {
    System.out.println("跨服务器文件上传");
    String path = "http://localhost:9090/uploads";

    String filename = upload3.getOriginalFilename();
    /*uuid*/
    String uuid = UUID.randomUUID().toString().replace("-", "");
    filename = uuid+filename;

    /*创建客户端对象*/
    Client client = Client.create();
    /*与图片服务器进行连接*/
    WebResource webResource = client.resource(path + filename);
    /*上传文件*/
    webResource.put(upload3.getBytes());
    /*可能报未存在文件夹的错误,手动创建就好了*/
    return "success";
}

8.拦截器

<!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
<!--            要拦截的具体方法-->
            <mvc:mapping path="/**"/>
            <!--不拦截的方法-->
<!--            <mvc:exclude-mapping path=""/>-->
            <bean class="cn.xmz.interceptor.MyInterceptor"></bean>
        </mvc:interceptor>

        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="cn.xmz.interceptor.MyInterceptor2"></bean>
        </mvc:interceptor>
    </mvc:interceptors>
/*
    * 预处理,controller方法执行之前
    * return true 放行,执行下一个拦截器,如果没有执行controller中的方法
    * return false 不放行
    * */
//    ctrl + o快捷键实现接口方法
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor执行了");
//        request.getRequestDispatcher("/response.jsp").forward(request,response);
        request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
        return false;
//        return true;
    }



    //最后处理方法,最后以该方法的跳转为主
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }

9.其他xml配置

<!--    配置自定义类型转换器-->
<!--    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">-->
<!--        <property name="converters">-->
<!--            <set>-->
<!--                <bean class="cn.xmz.utils.StringToDateConverter"/>-->
<!--            </set>-->
<!--        </property>-->
<!--    </bean>-->

    <!--前端控制器,哪些静态资源不拦截-->
    <mvc:resources mapping="/js/**" location="/js/"/>
    <mvc:resources mapping="/css/**" location="/css/"/>
    <mvc:resources mapping="/images/**" location="/images/"/>

おすすめ

転載: blog.csdn.net/qq_36603180/article/details/108894062