• 【转载】servlet与springMVC的差别


    一、servlet实现登录。

    咱们先来看一下servlet实现注册登录。

    <servlet>  
         <servlet-name>LoginServlet</servlet-name>                                3
         <servlet-class>demo.servlet.LoginServlet</servlet-class>                 4
    </servlet>  
    <servlet-mapping>  
         <servlet-name>LoginServlet</servlet-name>                                2
         <url-pattern>login</url-pattern>                                         1
    </servlet-mapping>  
           访问顺序为1—>2—>3—>4,其中2和3的值必须相同。
    

     url-pattern 标签中的值是要在浏览器地址栏中输入的 url,可以自己命名,这个 url 访问名为 servlet-name 中值的 servlet,两个 servlet-name 标签的值必须相同,因为通过 servlet 标签中的 servlet-name 标签映射到 servlet-class 标签中的值,最终访问 servlet-class 标签中的 class。

    还有,web.xml 的 / 表示的是http://localhost:8080/ + 工程名。

    1、jsp页面

    <form action="login" method = "post">
    用户名:<input type="text"name = "userName"><br>
    密  码:<input type="password"name = "password"><br>
    <input type="submit" value="登录">
    

    2、点击登录按钮后,提交表单,首先匹配web.xml中的路径,找到<url-pattern>值是login的sevlet,然后根据name去匹配servlet类,找到LoginServlet。

    public class LoginServlet extends HttpServlet implements Servlet {  
        @Override  
        protected void doGet(HttpServletRequest request,  HttpServletResponse response) throws ServletException, IOException {  
            doPost(request, response);  
        }  
      
        @Override  
        protected void doPost(HttpServletRequest request,  HttpServletResponse response) throws ServletException, IOException {  
            String result = "";  
            // 获取用户名  
            String userName = request.getParameter("userName");         
            // 获取密码  
            String passwd = request.getParameter("password");              
    
            UserDao.SelectForLogin(userName, password); //数据中查找此人
    
            request.getSession().setAttribute("userName", userName);  
            response.sendRedirect("login_success.jsp");     
      }
    }  
    

    3、然后再跳转到登陆成功页面

    <body>  
            <div align=center>  
                ${userName } 欢迎您,登录成功!  
            </div>  
     </body>  
    

    但是总是需要手写跳转servlet,开发效率比较低,所以就涌现除了很多框架,比如struct2,spring等等。

    二、springMVC

    由于SpringMVC是方法级别的拦截,SpringMVC的方法之间基本上独立的,独享request response数据。它还可以和很多框架进行无缝集成,开发效率和性能高。下面介绍一下springMVC如何实现注册登录。

    1、jsp页面(登录)

    <div class="content">
        <form action="login.do" method="post">
    用户名:<input type="text" name="userName">
    密 码:<input type="password" name="password">
          <input class="submit" type="submit" value="登录">
        </form>
    </div>
    

    2、然后同样是匹配web.xml

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

    上面这段xml的意思就是,所有的以.do结尾的action都让org.springframework.web.servlet.DispatcherServlet这个类来处理。load-on-startup元素,标记容器是否在启动的时候,就加载这个servlet(实例化并调用其init()方法)。这时servlet不用初始化,而是交给容器去处理。

    Spring主要也是通过DispatcherServlet实现了Servlet这个接口,又叫前端控制器,来自前端的请求会先到达这里,它负责到后台去匹配合适的handler。

    DispatcherServlet的主要工作流程如下:

    前端请求到达DispatcherServlet。

    前端控制器请求HandlerMappering 查找Handler。

    如果查找到存在的处理器,进一步去调用service和dao层

    返回结果再到controller层,渲染具体的视图,返回结果给页面。

    3、然后加载sringMVC-servlet.xml配置文件。

    <!-- 可以扫描controller、service、...
    这里让扫描controller,指定controller的包
    -->
    <context:annotation-config></context:annotation-config>
    <context:component-scan base-package="com.xxx.fresh2017.controller"></context:component-scan>
    

    4、然后开始扫描controller这个类,找到login.do。这时是通过注解来找到自己所需要的方法。

    /**
     * 用户登录时,检查数据库中是否存在此人
    *
     * @param userName    输入的用户名
    * @param password    输入的用户密码
    * @param httpSession 设置session
     * @return 登陆成功返回登录成功,否则返回登录失败
    */
    @RequestMapping("login.do") 
    public String login(String userName, String password, HttpSession httpSession, HttpServletRequest request,HttpServletResponse resp) throws UnsupportedEncodingException { User user = UserDao.SelectForLogin(userName, password); //数据中查找此人    Optional<User> userPresent = Optional.of(user); if (userPresent.isPresent()) {     Cookie cookie = new Cookie("nickName", URLEncoder.encode(user.getNickName(), "utf-8"));     cookie.setMaxAge(24 * 60 * 60 * 7);     resp.addCookie(cookie);     request.setAttribute("nickName",user.getNickName());     resp.setCharacterEncoding("utf-8");     LOGGER.info("数据库里有这个人"); return "welcome";   } else { LOGGER.info("数据库里没有这个人");   } return "loginerror"; } 

    5、最后在返回登录成功界面,这时需要spring-servlet.xml里的视图解析器。

    <!-- 视图解析器
    解析jsp解析,默认使用jstl标签,classpath下的得有jstl的包
    -->
    <bean  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <!-- 配置jsp路径的前缀 -->
      <property name="prefix" value="/"/>
      <!-- 配置jsp路径的后缀 -->
      <property name="suffix" value=".jsp"/>
    </bean>
    

    上面这段代码的意思是解析controller中方法返回的jsp页面,前缀加“/”表示webapp根目录,配置后缀“.jsp”表示自动在返回值后加.jsp后缀,这样就找到了webapp下的wecome.jsp。

    <div class="welcomediv">
      欢迎:${nickName}
    </div>
    

    通过EL表达式显示登录用户昵称。

    至此springMVC登录功能就实现完成了。 

    spring框架已经是java web开发很主流的框架,这个框架有很多优点当然也有它的不足之处,比于之前的servlet,它一定程度上简化了开发人员的工作,使用servlet的话需要每个请求都去在web.xml中配置一个servlet节点,而Spring 中的DispatcherServlet他会拦截所有的请求,进一步去查找有没有合适的处理器,一个前端控制器就可以。

      

  • 相关阅读:
    菖蒲河公园-中山公园-天安门广场一日游
    LeetCode 485 Max Consecutive Ones
    LeetCode 766. Toeplitz Matrix
    LeetCode 566 Reshape the Matrix
    LeetCode 561. Array Partition I
    算法学习系列之(1):常用算法设计方法
    纪念2017,展望2018
    Java server数据之(4):Redis鸟瞰
    《机器学习》读书笔记-第一章 引言
    node.js实践第二天
  • 原文地址:https://www.cnblogs.com/smallwangmusk/p/11386543.html
Copyright © 2020-2023  润新知