澳门皇冠金沙网站▎在线官网
做最好的网站

SpringMVC

2019-10-06 作者:网络服务   |   浏览(117)

Servlet案例5:用户登录失败信息回显,servlet回显

登录失败信息回显不会的新的一个页面,而是显示在登录页面

一种方法是:

登录页面表单中每个字段后添加<span>标签写入失败信息,利用ajax技术

通过改变<span>标签的display:none属性添加失败信息

 

这里用的类似的方法:

数据库准备略,

注意写好对应的user类供BeanHandler使用

sevlet:

澳门皇冠金沙网站,在线官网 1

package login;

import java.io.IOException;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;

public class LoginServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        // 获得用户名密码
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        // 在数据库中查询
        User login = null;
        try {
            login = login(username, password);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        if (login != null) {
            // 成功,跳转首页
            response.sendRedirect(request.getContextPath());
        } else {
            // 错误
            // 在request域中存入错误信息
            request.setAttribute("loginInfo", "用户名或密码错误");
            request.getRequestDispatcher("/login.jsp").forward(request, response);
        }

    }

    public User login(String username, String password) throws SQLException {
        QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
        String sql = "select * from user where username=? and password=?";
        User user = runner.query(sql, new BeanHandler<User>(User.class), username, password);
        return user;

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

View Code

 

抽取连接池类:

澳门皇冠金沙网站,在线官网 2

package login;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class DataSourceUtils {

    private static DataSource dataSource = new ComboPooledDataSource();

    private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();

    // 直接可以获取一个连接池
    public static DataSource getDataSource() {
        return dataSource;
    }

    // 获取连接对象
    public static Connection getConnection() throws SQLException {

        Connection con = tl.get();
        if (con == null) {
            con = dataSource.getConnection();
            tl.set(con);
        }
        return con;
    }

    // 开启事务
    public static void startTransaction() throws SQLException {
        Connection con = getConnection();
        if (con != null) {
            con.setAutoCommit(false);
        }
    }

    // 事务回滚
    public static void rollback() throws SQLException {
        Connection con = getConnection();
        if (con != null) {
            con.rollback();
        }
    }

    // 提交并且 关闭资源及从ThreadLocall中释放
    public static void commitAndRelease() throws SQLException {
        Connection con = getConnection();
        if (con != null) {
            con.commit(); // 事务提交
            con.close();// 关闭资源
            tl.remove();// 从线程绑定中移除
        }
    }

    // 关闭资源方法
    public static void closeConnection() throws SQLException {
        Connection con = getConnection();
        if (con != null) {
            con.close();
        }
    }

    public static void closeStatement(Statement st) throws SQLException {
        if (st != null) {
            st.close();
        }
    }

    public static void closeResultSet(ResultSet rs) throws SQLException {
        if (rs != null) {
            rs.close();
        }
    }

}

View Code

 

注意写好c3p0-config.xml、web.xml配置文件

 

在登录页面加上这一句代码

<div><%=request.getAttribute("loginInfo")==null?"":request.getAttribute("loginInfo")%></div>

 

即可实现简单的信息回显

 

http://www.bkjia.com/Javabc/1300705.htmlwww.bkjia.comtruehttp://www.bkjia.com/Javabc/1300705.htmlTechArticleServlet案例5:用户登录失败信息回显,servlet回显 登录失败信息回显不会的新的一个页面,而是显示在登录页面 一种方法是: 登录页面表单...

一、SpringMVC 概述

    澳门皇冠金沙网站,在线官网 3

 

    Spring 为展现层提供的基于 MVC 设计理念的优秀的Web 框架,是目前最主流的 MVC 框架之一
    Spring3.0 后全面超越 Struts2,成为最优秀的 MVC 框架
    Spring MVC 通过一套 MVC 注解,让 POJO 成为处理请 求的控制器,而无须实现任何接口。
    支持 REST 风格的 URL 请求
    采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性

   SpringMVC和Spring的关系:
       软件开发的三层架构: web层【表示层、表现层】---->Service层---->Dao[DataBase Access Object]---->数据库!
      SpringMVC实际上是Spring的一个子模块,我们用SpringMVC来代替这个JavaWEB部分!
      MVC:也是一种设计模式:M:Model【模型】-->V[View]--->C[Controller]!
                          Model用来封装数据的,View:用来显示数据  Controller:用于接收前端页面发送的请求,然后调用Service层处理,拿到处理结果,将该结果返回给前端页面!
                          
SpringMVC:相当于MVC架构中的C以及V!
SpingMVC是基于SpingMVC4.x

二、SpringMVC之HelloWorld

       1.加入JAR包

澳门皇冠金沙网站,在线官网 4澳门皇冠金沙网站,在线官网 5

  –commons-logging-1.1.3.jar
            –spring-aop-4.0.0.RELEASE.jar
            –spring-beans-4.0.0.RELEASE.jar
            –spring-context-4.0.0.RELEASE.jar
            –spring-core-4.0.0.RELEASE.jar
            –spring-expression-4.0.0.RELEASE.jar
            –spring-web-4.0.0.RELEASE.jar
            –spring-webmvc-4.0.0.RELEASE.jar

View Code

        2.配置前端控制器【DispatcherServlet】

澳门皇冠金沙网站,在线官网 6澳门皇冠金沙网站,在线官网 7

  <!-- The front controller of this Spring Web application, responsible for handling all application requests -->
        <!--向服务器注册前端控制器!  -->
        <servlet>
            <servlet-name>springDispatcherServlet</servlet-name>
            <!--DispatcherServlet指的是SpringMVC的前端控制器!,给服务器使用,创建servlet对象!  -->
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!-- 初始化参数contextConfigLocation用于指定SpringMVC配置文件的路径以及名称 -->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springmvc.xml</param-value>
            </init-param>
            <!-- 数字0或者大于0的数字表示的是:在服务器启动的时候创建Servlet对象,而不是第一次访问的时候创建
                小于0的数字指的是:在第一次访问的时候创建Servlet对象.
                在数字大于O的情况下,数字越小,优先级越高!
             -->
            <load-on-startup>1</load-on-startup>
        </servlet>

        <!-- Map all requests to the DispatcherServlet for handling -->
        <!-- 用 servlet-mapping指定请求映射的路径-->
        <servlet-mapping>
            <servlet-name>springDispatcherServlet</servlet-name>
            <!-- 用url-pattern指定拦截 的请求路径! -->
            <url-pattern>/</url-pattern>
        </servlet-mapping>

View Code

   3.创建SpringMVC的配置文件并添加要扫描的包

        注意:1)创建SpringMVC配置文件的名字要和上面在web.xml文件中指定的名字一致!
               2)我们创建SpringMVC配置文件的时候使用的是Spring Bean Configuration File创建的,不是XML!

澳门皇冠金沙网站,在线官网 8澳门皇冠金沙网站,在线官网 9

 <!-- 配置SpingMVC容器要扫描的包! -->
        <context:component-scan base-package="com.neuedu.controller"></context:component-scan>

View Code

   4.在springMVC扫描的包下创建控制器类[Controller/Handler]澳门皇冠金沙网站,在线官网,,注意要加入@Controller注解  

澳门皇冠金沙网站,在线官网 10澳门皇冠金沙网站,在线官网 11

           /**
             * 我们通过@RequestMapping做请求URL的映射!
             * @return
             */
            @RequestMapping("/sayHello")
            public String sayHello(){
                return "/WEB-INF/views/success.jsp";
            }

View Code

   
      注意:在类的方法上我们使用的是@RequestMapping,然后在括号里指定请求url的请求路径!

        5.创建页面!

    注意:1)当我们不用init-param指定springMVC配置文件的路径好位置的时候,SpringMVC默认会去 /WEB-INF/<servlet-name>-servlet.xml
 
               2)配置视图解析器

澳门皇冠金沙网站,在线官网 12澳门皇冠金沙网站,在线官网 13

  <!--InternalResourceViewResolvers 是视图解析器 ,它会将逻辑视图转换成实际的物理视图,做一个转发操作!
            也就是说具体步骤:prefix +  方法的返回值  + suffix-->
            <!-- /WEB-INF/views/success.jsp -->
            <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <property name="prefix" value="/WEB-INF/views/"></property>
                <property name="suffix" value=".jsp"></property>
            </bean>

View Code

            3)请求一个SpringMVC的流程!        

 三、使用 @RequestMapping 映射请求

    Spring MVC 使用 @RequestMapping 注解为控制器指定可以处理哪些 URL 请求, 在控制器的类定义及方法定义处都可标注
    @RequestMapping
      –    类定义处:提供初步的请求映射信息。相对于 WEB 应用的根目录
      –    方法处:提供进一步的细分映射信息。相对于类定义处的 URL。若 类定义处未标注 @RequestMapping,则方法 处标记的 URL 相对于 WEB 应用的根目录
                
    DispatcherServlet 截获请求后,就通过控制器上@RequestMapping 提供的映射信息确定请求所对应的处理方法。
    
    映射请求参数、请求方法或请求头
       @RequestMapping 除了可以使用请求 URL 映射请求外,还可以使用请求方法、请求参数及请求头映射请求
       @RequestMapping 的 value、method、params 及 heads 分别表示请求   URL、请求方法、请求参数及请求头的映射条件,他们之间是与的关系,联合使用多个条件可让请求映射 更加精确化。
        
     params 和 headers支持简单的表达式:
          –    param1: 表示请求必须包含名为 param1 的请求参数
          –    !param1: 表示请求不能包含名为 param1 的请求参数
          –    param1 != value1: 表示请求包含名为 param1 的请求参数,但其值 不能为 value1
          –{“param1=value1”, “param2”}: 请求必须包含名为 param1 和param2 的两个请求参数,且 param1 参数的值必须为 value1!

    使用 @RequestMapping 映射请求
    Ant 风格资源地址支持 3 种匹配符:
      –    :匹配文件名中的一个字符
      –    *:匹配文件名中的任意字符
      –    **:** 匹配多层路径
    
         @RequestMapping 还支持 Ant 风格的 URL:
          –/user/*/createUser: 匹配
            /user/aaa/createUser、/user/bbb/createUser 等 URL
          –/user/**/createUser: 匹配
           /user/createUser、/user/aaa/bbb/createUser 等 URL
          –/user/createUser: 匹配
            /user/createUseraa、/user/createUserbb 等 URL
        
    @PathVariable    映射 URL 绑定的占位符
         带占位符的 URL 是 Spring3.0 新增的功能,该功能在 SpringMVC 向 REST 目标挺进发展过程中具有里程碑的 意义
         通过 @PathVariable 可以将 URL 中占位符参数绑定到控 制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过
          @PathVariable("xxx") 绑定到操作方法的入参中,需要注意的是:该注解的value属性值要与占位符保持一致。          

四、REST( Representational State Transfer)

       作用: (资源)表现层状态转化。是目前最流行的一种互联网软件架。 它结构清晰、符合标准、易于理解、扩展方便, 所以正得到越来越多网站的采用.
        
       HTTP 协议里面,四个表示操作方式的动 词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET 用来获 取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。
      
        示例:
              –/order/1    HTTP GET :得到 id = 1 的 order
              –/order/1    HTTP DELETE:删除 id = 1的 order
              –/order/1    HTTP PUT:更新id = 1的 order
              –/order    HTTP POST:新增 order
            
            HiddenHttpMethodFilter:浏览器 form 表单只支持 GET 与 POST 请求,而DELETE、PUT 等 method 并不支 持,Spring3.0  添加了一个过滤器,可以将这些请求转换 为标准的 http 方法,使得支持 GET、POST、PUT 与 DELETE 请求。
            
        POST请求转化为put请求和delele请求过程
             1)在web.xml文件中配置:

澳门皇冠金沙网站,在线官网 14澳门皇冠金沙网站,在线官网 15

 <!-- HiddenHttpMethodFilter过滤器可以将POST请求转化为put请求和delete请求! -->
            <filter>
                <filter-name>hiddenHttpMethodFilter</filter-name>
                <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
            </filter>
            <filter-mapping>
                <filter-name>hiddenHttpMethodFilter</filter-name>
                <url-pattern>/*</url-pattern>
            </filter-mapping>

View Code     

            2)在表单域中需要携带一个name值为_method,value值为put或者delete的参数,如下所示:

澳门皇冠金沙网站,在线官网 16澳门皇冠金沙网站,在线官网 17

   <form action="${pageContext.request.contextPath }/order/1" method="post">
            <input type="hidden" name="_method" value="put"/>
            <input type="submit" value="Submit"/>
        </form>
        <form action="${pageContext.request.contextPath }/order/1" method="post">
            <input type="hidden" name="_method" value="delete"/>
            <input type="submit" value="Submit"/>
        </form>       

View Code

五、请求处理方法签名

        Spring MVC 通过分析处理方法的签名,将 HTTP 请求信 息绑定到处理方法的相应人参中。 Spring MVC 对控制器处理方法签名的限制是很宽松的, 几乎可以按喜欢的任何方式对方法进行签名。 必要时可以对方法及方法入参标注相应的注解(@PathVariable、@RequestParam、@RequestHeader 等)、SpringMVC 框架将 HTTP请求的信息绑定到相应的方法入参中,并根据方法的返回值类型做出相应的后续处理。 

           1、使用 @RequestParam 绑定请求参数值

        在处理方法入参处使用 @RequestParam 可以把请求参 数传递给请求方法
        –    value:参数名
        –    required:是否必须。默认为 true, 表示请求参数中必须包含对应 的参数,若不存在,将抛出异常

      2、@RequestParam可以接收请求的参数,相当于Servlet的getParameter()方法

    注意:要把@RequestParam和@PathVariable区分开  
    三个默认属性:
       value:这个字段要与请求参数的name属性值一致!
       required:布尔值,默认是true,当指定为false的时候,说明这个参数不是必须的,可以不带!
       defaultValue:在我们不传值的时候,默认使用defaultValue的值,传递参数的时候,使用我们传递的参数值!

     3、@RequestHeader:获取请求头信息,默认属性:

          value:这个字段要与请求参数的name属性值一致!
          required:布尔值,默认是true,当指定为false的时候,说明这个参数不是必须的,可以不带!
          defaultValue:在我们不传值的时候,默认使用defaultValue的值,传递参数的时候,使用我们传递的参数值! 

       4、使用 @CookieValue 绑定请求中的 Cookie 值

        @CookieValue 可让处理方法入参绑定某个 Cookie 值   

          5、使用 POJO 对象绑定请求参数值

        Spring MVC 会按请求参数名和 POJO 属性名进行自动匹 配,自动为该对象填充属性值。支持级联属性。 如:dept.deptId、dept.address.tel 等

    6、.MVC 的 Handler 方法可以接受哪些 ServletAPI 类型的参数

        HttpServletRequest
        HttpServletResponse
        HttpSession

六、处理模型数据

     Spring MVC 提供了以下几种途径输出模型数据:
      –ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加模型数据
      –Map 及 Model: 入参为 org.springframework.ui.Model、org.springframework.ui. ModelMap 或 java.uti.Map 时,处理方法返回时,Map 中的数据会自动添加到模型中。
      –@SessionAttributes: 将模型中的某个属性暂存到HttpSession 中,以便多个请求之间可以共享这个属性
      – @ModelAttribute: 方法入参标注该注解后, 入参的对象 就会放到数据模型中.

1、ModelAndView

    控制器处理方法的返回值如果为 ModelAndView, 则其既 包含视图信息,也包含模型数据信息。
        添加模型数据:
          –MoelAndView addObject(String attributeName, Object attributeValue)
          –ModelAndView addAllObject(Map<String, > modelMap)
        设置视图:
        –void setView(View view)
        –void setViewName(String viewName)

 

 2、Model AND  MAP

    Spring MVC 在内部使用了一个 org.springframework.ui.Model 接口存 储模型数据
        具体步骤
        –    Spring MVC 在调用方法前会创建一个隐 含的模型对象作为模型数据的存储容器。
        –    如果方法的入参为 Map 或 Model 类 型,Spring MVC 会将隐含模型的引用传 递给这些入参。在方法体内,开发者可以通过这个入参对象访问到模型中的所有数 据,也可以向模型中添加新的属性数据        

3、多个请求之间共用某个模型属性数据

    方法: 可以在控制器类上标注一 个 @SessionAttributes, SpringMVC将在模型中对应的属性暂存到 HttpSession 中。
    @SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外,还可以通过模型属性的对象类型指定哪些 模型属性需要放到会话中
      –@SessionAttributes(types=User.class) 会将隐含模型中所有类型为 User.class 的属性添加到会话中。
      –@SessionAttributes(value={“user1”, “user2”})
      –@SessionAttributes(types={User.class, Dept.class})
      –@SessionAttributes(value={“user1”, “user2”}, types={Dept.class})
    
  @ModelAttribute[使用场景]
      在方法定义上使用 @ModelAttribute 注解:Spring MVC在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute 的方法。
      在方法的入参前使用 @ModelAttribute 注解:
            –    可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数绑定到对象中,再传入入参
            –    将方法入参对象添加到模型中

4、针对POST请求乱码的处理   

   在web.xml文件中加上CharacterEncodingFilter   

澳门皇冠金沙网站,在线官网 18澳门皇冠金沙网站,在线官网 19

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

View Code

 

七、转发、重定向

1、转发         

澳门皇冠金沙网站,在线官网 20澳门皇冠金沙网站,在线官网 21

     <!-- 配置直接转发的页面 -->
        <!-- 可以直接转发到响应的页面,而无需再经过Handler的方法了 -->
        <mvc:view-controller path="/success" view-name="success"/>
            <!-- 访问静态资源! -->
        <mvc:default-servlet-handler/>
        <!-- 将ConversionService再作为annotation-driven的一个属性存在! -->
        <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>

View Cod

    2、重定向

    一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理
    如果返回的字符串中带 forward: 或 redirect: 前缀 时,SpringMVC 会对他们进行特殊处理:将 forward: 和 redirect: 当成指示符,其后的字符串作为 URL 来处理
          –redirect:/success.jsp:会完成一个到 success.jsp 的重定向的操作
          –forward:/success.jsp:会完成一个到 success.jsp 的转发操作
        
        可以在spingmvc配置文件中配置     <mvc:view-controller path="/j1sp" view-name="success"/>标签,就可以让我们的请求不经过Controller,直接进入另一个目标页面!
        <!-- 但是此时原来访问正常的@RequestMapping URL现在却不能正常访问了,如果想正常访问,需要加入<mvc:annotation-driven>该标签-->
        <mvc:annotation-driven></mvc:annotation-driven>

八、SpringMVC确定目标方法POJO类型入参的过程:

    1.确定一个key

          1).若目标方法的POJO类型的参数木有使用@ModelAttribute作为修饰,则key为POJO类名第一个字母的小写。
          2).若使用@ModelAttribute修饰,则key为@ModelAttribute注解的value属性值

    2.在implicitModel中查找key对应的对象,若存在,则作为入参传入。

          1).若在@ModelAttribute标记的方法中在Map保存过,且key和1确定的key一致,则会获取到!

    3.implicitModel

    在implicitModel中不存在key对应的对象,则检查当前的Handler是否使用@SessionAttribute注解修饰,若使用了该主机,且@SessionAttributes注解的value属性值中包含了 key,则会从HttpSession中来获取key所对应的value值,若存在则直接传入到目标方法的入参中,若不存在则将抛出异常。   

本文由澳门皇冠金沙网站发布于网络服务,转载请注明出处:SpringMVC

关键词: