SpringMvc和servlet简单对比介绍
一、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> 密 码:<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");
推荐阅读