JavaWeb.servlet使用
失格LXY 人气:0前言:
我们在前几篇文章里的web项目都是用jsp文件完成的,那么什么时候jsp算是学完了呢?——在jsp文件中没有java代码。
在原来的doxxx.jsp文件里写的都是处理登陆或者主页面功能的java代码,现在我们需要servlet来代替doxxx.jsp文件。
一.实现servlet
我们可以一个登陆来当例子。
建一个com.xxx.servlet包,在写一个LoginServlet类
package com.zking.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * * @author zjjt *用来实现登陆请求的处理 */ public class LoginServlet implements Servlet{ //生命周期 @Override//初始化 public void init(ServletConfig arg0) throws ServletException { //当请求来到这个servlet就会调用init方法 System.out.println("开始初始化"); } @Override//服务 public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException { // 所有的代码写在这个方法中 //强转响应 HttpServletResponse response = (HttpServletResponse) resp; //强转请求 HttpServletRequest request = (HttpServletRequest) req; //如果用户名是中文 req.setCharacterEncoding("utf-8"); //取到用户数据 String username = req.getParameter("username"); String password = req.getParameter("password"); //通过响应对象获得输出对象 PrintWriter out = response.getWriter(); //通过请求对象取session,需要强转请求 HttpSession session = request.getSession(); //取application通过请求对象 ServletContext application = request.getServletContext(); //与数据库数据做对比 if("root".equals(username)&&"root123".equals(password)) { //登陆成功 //转发:req.getRequestDispatcher("/xx").forward(req, resp); //重定向:需要强转响应 //response.sendRedirect("/xx"); out.println("登陆成功"); }else { //登陆失败 out.println("登陆失败"); } } @Override//销毁 public void destroy() { //什么时候销毁 //1.服务关闭时 //2.这个类被修改时 System.out.println("我销毁了"); } @Override//得到配置 public ServletConfig getServletConfig() { // TODO Auto-generated method stub return null; } @Override//得到信息 public String getServletInfo() { // TODO Auto-generated method stub return null; } }
家人们注意了在代码里我使用了强转,是因为ServletRequest 和 ServletResponse 没有重定向功能,所有request(请求)和response(响应)取不到值。但是ServletRequest 和 ServletResponse的子类有重定向功能所有,我们要进行强转。
提供访问路径【web.xml】
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0"> <display-name>Web20</display-name> <!-- web.xml是整个项目的配置文件 --> <welcome-file-list> <welcome-file>/index.jsp</welcome-file> </welcome-file-list> <!-- 1.配置servlet --> <servlet> <!-- 给取个名字 --> <servlet-name>one</servlet-name> <!-- servlet-class需要填上类的全路径 --> <servlet-class>com.zking.servlet.LoginServlet</servlet-class> </servlet> <!-- 2.配置servlet的访问路径 --> <!-- mapping 映射 --> <servlet-mapping> <!-- 对应的servlet的名字 --> <servlet-name>one</servlet-name> <!-- 给它配置一个访问路径 --> <url-pattern>/login.do</url-pattern> </servlet-mapping> </web-app>
切记修改了web.xml的代码一定要重启服务器
访问路径一定要加/,否则运行会报错
登陆界面代码:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <!-- action里填配置的路径不需要加/ --> <form action="login.do" method="post"> <p><input type="text" name="username"></p> <p><input type="text" name="password"></p> <p><button>登陆</button></p> </form> </body> </html>
这样我们的登陆就完成了,但是这样大家会不会觉得代码有点多,没关系,还有其他方法。
二.开发模式
我们的开发模式有两种,一种是(传统的开发模式)配置式开发,另一种是注解式开发。我们上面所讲的就是配置式开发,接下来我们来讲一讲注解式开发~( ̄▽ ̄)~*。
注解式开发使用的是@注解,在代码中@WebServlet就等于web.xml里的
在@WebServlet后面加上(),在里面直接填入路径,例如@WebServlet("/xxx")就等于web.xml里的
三.继承Servlet
使用注解式开发的方法我们就可以不用修改web.xml代码了,是不是简单多了(●'◡'●)。接下来我们写一个MyServlet文件,写Servlet有两种方法,一种式实现,另一种是继承。实现的方法我们已经写过了,接下来我们使用继承的方法
package com.zking.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * * @author zjjt * */ @WebServlet("/test.do")//直接填访问路径 public class MyServlet extends HttpServlet{ //不同的请求方式: //doGet 专门处理get请求 //doPost 专门处理post请求 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //登陆功能 doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //登陆功能 //如果用户名是中文 req.setCharacterEncoding("utf-8"); //取到用户数据 String username = req.getParameter("username"); String password = req.getParameter("password"); //支持中文的编码【utf-8】【gb2312】【big5】 req.setCharacterEncoding("gb2312"); //通过响应对象获得输出对象 PrintWriter out = resp.getWriter(); //通过请求对象取session,需要强转请求 HttpSession session = req.getSession(); //取application通过请求对象 ServletContext application = req.getServletContext(); //与数据库数据做对比 if("root".equals(username)&&"root123".equals(password)) { //登陆成功 //转发:req.getRequestDispatcher("/xx").forward(req, resp); //重定向:需要强转响应 //response.sendRedirect("/xx"); out.println("登陆成功"); }else { //登陆失败 out.println("登陆失败"); } } }
家人们有发现实现和继承servlet有什么区别了吗
我相信细心的家人们应该已经发现了我这里继承的是HttpServlet而不是Servlet。这是因为HttpServlet是它的子类,具有重定向功能,这下我们又可以省去强转的部分了。所有我推荐大家使用注解式开发模式和继承Servlet的方式来写Servlet哟~
总结
加载全部内容