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

首先对servlet进行对比在进行分析

一、servlet实现登录。

1, web.xml 实现:

<servlet>
   <servlet-name>loginServlet</servlet-name>
   <servlet-class>lequ.servlet.loginServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>loginServlet</servlet-name>
    <url-pattern>login</url-pattern>
</servlet-mapping>

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

2,jsp页面

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

3、点击登录按钮后,提交表单,首先匹配web.xml中的路径,找到值是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 自己封装的业务层)
        UserDao.SelectForLogin(userName, password); 

        request.getSession().setAttribute("userName", userName);  
        response.sendRedirect("login_success.jsp");     
  }
}

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

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

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

二、springMVC

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

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

<servlet>  
        <servlet-name>mvc</servlet-name> 
         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
 </servlet>
<servlet-mapping>
          <servlet-name>mvc</servlet-name>
          <url-pattern>login.do</url-pattern>
 </servlet-mapping>

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

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

DispatcherServlet的主要工作流程如下:

1.前端请求到达DispatcherServlet。

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

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

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

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

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

3、然后开始扫描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";
}

@RequestMapping(“login.do”) 这个注解是SpringMVC中的一个注解,该注解说明的是,对于login.do的请求,
通过注解标签下面的方法进行响应。相当于方法的一个URL。

4、最后在返回登录成功界面

这时需要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。

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