SpringMvc和servlet簡單對比介紹
引言:由於最近要開始springMVC的學習,所以現在先簡單介紹一下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 = "get"> 用戶名:<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("txtUserName"); // 獲取密碼 String passwd = request.getParameter("txtPassword"); UserDao.SelectForLogin(userName, password); //數據中查找此人 request.getSession().setAttribute("UserName", sUserName); 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">
歡迎:${}<span id="loginSuccess">登陸成功</span> </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");
2、cookie
新建cookie
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");
jsp頁面獲取cookie值
${nickName}
過濾器獲取cookie
Cookie[] cookies = servletRequest.getCookies(); if (cookies != null) { for (int i = 0; i < cookies.length; i++) { if (cookies[i].getName().equals("nickName")) { nickName = URLDecoder.decode(cookies[i].getValue()); break; } } }
SpringMvc和servlet簡單對比介紹