原文链接:http://www.cnblogs.com/haolnu/p/7294533.html

一、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来进行开发,咱们公司也是采用springMVC来进行。下面我介绍一下springMVC如何实现注册登录。

1、jsp页面(登录)

<div class="content">
<form action="login.do" method="post">
用户名:<input type="text" name="userName">
<p>
密&nbsp;&nbsp;&nbsp;&nbsp;码:<input type="password" name="password">
<p>
<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>
<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.qunar.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";
}

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

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他会拦截所有的请求,进一步去查找有没有合适的处理器,一个前端控制器就可以。

下面在介绍一下session和cookie的使用方法。

1、session

 新建session,并添加参数。

HttpSession session = request.getSession();
session.setAttribute("nickName", value);
jsp页面获取session
${nickName}
过滤器获取session

String nickName = (String) session.getAttribute("nickName");

SpringMvc和servlet简单对比介绍的更多相关文章

  1. IPv4和IPv6简单对比介绍(转载)

    原链接:https://baijiahao.baidu.com/s?id=1570208896149974&wfr=spider&for=pc 在配置计算机网络,特别是内网的时候,有时 ...

  2. Java传统IO流和NIO流的简单对比介绍

    通过对文件的拷贝来对比传统IO流和NIO流 将底层流封装成处理流以后进行分段读取. /*将本身源代码拷贝到TXT文件*/ public class TraditionIO { public stati ...

  3. Struts2、SpringMVC、Servlet(Jsp)性能对比 测试

    Struts2.SpringMVC.Servlet(Jsp)性能对比 测试 . Servlet的性能应该是最好的,可以做为参考基准,其它测试都要向它看齐,参照它. 做为一个程序员,对于各个框架的性能要 ...

  4. 10.Servlet简单介绍

    1.什么是Servlet * Servlet是javaweb的三大组件之一,它属于动态资源.Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet种通常需要: ...

  5. .NET轻量级MVC框架:Nancy入门教程(二)——Nancy和MVC的简单对比

    在上一篇的.NET轻量级MVC框架:Nancy入门教程(一)——初识Nancy中,简单介绍了Nancy,并写了一个Hello,world.看到大家的评论,都在问Nancy的优势在哪里?和微软的MVC比 ...

  6. 【转贴】Cortex系列M0-4简单对比

    转载网址:http://blog.sina.com.cn/s/blog_7dbd9c0e01018e4l.html 最近搞了块ST的Cortex-M4处理器,然后下了本文档.分享一下. 针对目前进入大 ...

  7. JS图表组件 highcharts 简单的介绍

    把highcharts拿来做个简单的介绍,希望更多的朋友可以用到这个用来做图表的js插件. preparation Highcharts Highcharts是一个制作图表的纯Javascript类库 ...

  8. Nancy和MVC的简单对比

    Nancy和MVC的简单对比 在上一篇的.NET轻量级MVC框架:Nancy入门教程(一)——初识Nancy中,简单介绍了Nancy,并写了一个Hello,world.看到大家的评论,都在问Nancy ...

  9. 【java学习】Servlet简单的表单程序(一)

    此文用于java学习,在此小记. 在此小Demo中使用到了Servlet,所以有必要了解一下Servlet的相关知识.(Servlet的相关知识摘抄自http://blog.csdn.net/jiuq ...

随机推荐

  1. C# 自动触发鼠标、键盘事件

    要在C#程序中触发鼠标.键盘事件必须要调用windows函数. 一.鼠标事件的触发 1.引用windows函数mouse_event /// <summary> /// 鼠标事件 /// ...

  2. cocos2d-x入门三 分层设计框架

    helloworld就是一个完整的框架,大致分为四个层次如下: 导演-------场景------图层-----精灵 Director-----Scene----Layer----Sprite 导演类 ...

  3. Git出现fatal: Unable to find remote helper for 'https'

    使用Git远程获取代码 git clone https://github.com/twlkyao/findfile.git 出现“fatal: Unable to find remote helper ...

  4. linux文件的一些特殊权限

    一些特殊权限 虽然我们通常看到一个八进制的权限掩码用三位数字来表示,但是从技术层面 上来讲,用四位数字来表示它更确切些. 为什么呢?因为,除了读取,写入,和执 行权限之外,还有其它的,较少用到的权限设 ...

  5. 【Linux】结合Python 简易实现监控公司网站,邮件发送异常

    背景 由于一些原因,博主负责测试的网站的服务器切换到了香港,切换后出现了多次访问超时的情况 于是主动请缨写一个自动监测的脚本,本来准备完全使用shell来写,后来发现shell发送邮件只能在测试机之间 ...

  6. angular2中的路由转场动效

    1.为什么有的人路由转动效离场动效不生效? 自己研究发现是加动效的位置放错了  如下: <---! animate-state.component.html --> <div sty ...

  7. ctci1.4

    ;     ;     ; i < len ; i++)         ;      +];     ; i < len; i++){         ';         }      ...

  8. MYSQL中的日期转换

    MYSQL中的日期转换 网址: http://www.eygle.com/digest/2006/09/mysql_date_convert.html 对于每个类型拥有的值范围以及并且指定日期何时间值 ...

  9. Factorialize a Number

    计算一个整数的阶乘 如果用字母n来代表一个整数,阶乘代表着所有小于或等于n的整数的乘积. 阶乘通常简写成 n! 例如: 5! = 1 * 2 * 3 * 4 * 5 = 120 当你完成不了挑战的时候 ...

  10. ElementTree之Xml文档处理

    ElementTree: 表示整个XML层级结构 Element: 表示树形结构中所有的父节点 SubElement: 表示树形结构中所有的子节点 有些节点既是父节点,又是子节点 下面来看下这两个类的 ...