在全栈开发中,学完基础后,我们首先要下载tomcat以及对它的使用,有的人可能就要问到,什么是tomcat。实际上它就是一个服务器软件。然后,我们会学到servlet。大家可能对servlet有点陌生,但说起来,它就是Java的接口之一,也是JavaWeb三大组件之一,后期会给大家讲到三大组件都有什么。既然我们已经知道了servlet是一个接口,那么就需要一个类去实现这个接口,后面会跟大家讲如何实现。接下来就是一个重点了,它就是JSP。JSP全名是Java Server Page,是Java的服务页面,主要作用是代替Servlet程序,回传html的数据。在JSP中也有很多我们要学习的东西,在这里我就不一一介绍了,以后我会专门给大家介绍的。
首先,我们要创建一个Java的web工程,具体的做法大家可以查看下面链接,有专门介绍如何创建的。在web工程中,有两个包,一个包是src,一个是web。我们首先应该在src下建立一个包,我把它命名为com,然后在com包下再建立六个包,分别是dao包,service包,pojo包,test包,utils包,webSrc包(我这里没有建立controller包)。我们还要在src包下建立一个properties,里面是进行数据库的连接。在web包中,本来就有一个web-inf包,我们在web包里还要建立几个包,当然了,这个可以根据个人习惯来,我是喜欢建立page包,static包。因为我在开发的时候没有使用到maven,因此我的所有jar包(依赖)都是自己导入的,导入的方法也在下面链接。然后,应该在web-inf下建立一个文件夹,然后名字是lib,里面放各种jar包,具体的jar包在这里。jar包资源 java web 工程的创建以及lib中依赖如何引入
然后,我讲一下com的包中,每个包的作用。在dao包中,我们会建立一个impl包和各种接口类,而impl包则是继承接口,来实现接口类里面的方法的。pojo包就是里面是具体的类,这里面类的变量都是与数据库息息相关的。service包中也是有impl包和接口类,在impl中需要调用dao包中的方法和service接口类的方法来实现 。test包顾名思义,它就是一个测试类。
public class JdbcUtilsTest {
@Test
public void TestJdbcUtils(){
System.out.println(JdbcUtils.getConnection());
}
}
在上面的代码中就是对数据库是否连接成功做一个测试。utils包就是一个大类的东西,里面我常常放置的是数据库的连接以及在接收到jsp传入到后端的数据进行数据类型的转化。webSrc包中就是与servlet有关的类了。(在web包中都是有关前端的,我就不给大家具体描述了)
下面,就涉及到了我们具体开发的流程中了。大家想必已经知道了,首先,我们就是要连接我们的数据库,我用的是MySQL,数据库软件用的是SQLyog。在前面我提到了一个properties,![](https://img-blog.csdnimg.cn/dfc0731dd3af4e4681cea4df65f21d65.png)我经常会这么命名,在这里,我们进行数据库连接的配置,
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/book?characterEncoding=UTF-8
username=root
password=###
initialSize=5
maxActive=10
maxWait=3000
大家要注意,第二行的url中book是你要链接的数据库的名字,端口也是你自己配置的,后面的字符集是我自己加上的,因为要是不加的话,会导致你存入数据库的中文数据乱码,数据库的用户名和密码,这都是自己设定的,我用的是德鲁伊连接池,大家也可以用别的。
接下来,我给大家举一个用户登录的例子。![](https://img-blog.csdnimg.cn/5a9af1b36bd4463cb1de6f3c90796b43.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aSc5LiN5L-u,size_15,color_FFFFFF,t_70,g_se,x_16)
大家看到了这里有一个学号的输入和密码的输入,那么大家肯定疑惑了,如何让前端输入的数据传到后端
name="CardId"
name="password"
大家需要在前端jsp页面中给学号和密码定义一个name,但以什么途径传过去,就是下面的的代码
action="loginServlet?action=login"
我们在action中定义类的名字以及要调用类中的哪个方法,
public class LoginServlet extends BaseServlet{
private UserService userService = new UserServiceImpl();
protected void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String CardId = req.getParameter("CardId");
String password = req.getParameter("password");
User loginUser = userService.login(new User(null,CardId,null,password,null));
if(loginUser==null){
req.setAttribute("msg","学号或密码错误");
req.setAttribute("CardId",CardId);
req.getRequestDispatcher("/pages/user/login.jsp").forward(req, resp);
}else if(userService.getStatus(CardId).equals("true")){
loginUser.setUname(userService.getName(CardId));
req.getSession().setAttribute("loginUser",loginUser);
req.getRequestDispatcher("/pages/managerPages/first.jsp").forward(req,resp);
}else if(userService.getStatus(CardId).equals("false")){
loginUser.setUname(userService.getName(CardId));
req.getSession().setAttribute("loginUser",loginUser);
req.getRequestDispatcher("/pages/studentPages/first.jsp").forward(req,resp);
}
}
protected void logout(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getSession().invalidate();
resp.sendRedirect(req.getContextPath());
}
}
而LoginServlet类就是我们在webSrc中建立的类,在我的代码中它继承于BaseServlet,但实际上它继承于HttpServlet,
public class BaseServlet extends HttpServlet {
private UserService userService = new UserServiceImpl();
@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 action = req.getParameter("action");
try {
Method method = this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
method.invoke(this,req,resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
接下来,我们在前端已经告诉了编译器我们要调用的类及方法,那么我们就会去找到对应的方法和类。大家看到了之前的username和password,实际上,他们的值已经被我们存在了域中,那么我们要获取这个值,就要去调用域中的值
String CardId = req.getParameter("CardId");
String password = req.getParameter("password");
我们调用的是req中的getParamete,获取请求的参数,那么我们的方法就会获取到前端输入的值,并作出判断(判断过程我就不给大家讲述了,大家可以看一下我前面的代码)。当然了,我们在判断的过程中,我们就要去数据库查找输入的用户名和密码是否在数据库中存在。那么要实现这一操作,首先,我们要遭dao类中写一个接口类,
public User queryUserByUsernameAndPassword(String username, String password);
我把它命名为userDao,在其中写这么一个方法,然后呢,再在impl包中写一个实现类,实现它的方法,
@Override
public User queryUserByUsernameAndPassword(String CardId, String password) {
String sql = " select id,CardId,NAME,password from t_user where CardId = ? and password = ?";
return queryForOne(User.class,sql,CardId,password);
}
在这里,我们要写对应的sql语句,然后并返回相应的值,而调用的方法就是我们在引入依赖的方法。接下来我们就依次在service中写接口类和对应的实现类,在实现类中调用userDao中的方法,进行操作,那么,我们就完成了登录页面的后端操作,大家在做完后可以自己在test包中写相应的测试类来测试每一步是否正确。为了页面能正常运行,我们还需要在jsp页面配置一下工程路径,
<%
String path = request.getScheme()
+"://"
+request.getServerName()
+":"
+request.getServerPort()
+request.getContextPath()+"/" ;
%>
这样,我们登录界面就完成了。
版权归原作者 夜不修 所有, 如有侵权,请联系我们删除。