为什么要引入struts?
既然Servlet能够完成的事,我们为啥要用框架呢??
- 框架帮我们封装了很多常用的功能
- 把Web带过来的参数自动封装到JavaBean中[以前,我们刚开始学的时候是单个单个来获取参数的,后来我们又使用了BeanUtils写工具方法来帮我们封装]。现在,我们使用了Struts2的话,那么框架内部就能帮我们封装了。
- 更加灵活[不用把路径等信息写死在程序上],对于路径我们使用配置文件来进行管理,如果目录发生了变化,也不用一个一个去修改每个程序的路径。
- 每个Servlet中都有doGet和doPost这样的方法,没必要的。我们抽取出来,通过配置文件来把这两个方法替换掉,那么我们的程序就会更加优雅了。
于是乎,struts2就应运而生了。
自定义struts
在正式讲解struts之前,我们来看一下,以我们现在的水平,能够怎么优化它。。
以用户的登陆注册案例来进行说明
传统的用户登陆注册
dao
if ("aaa".equals(user.getUsername()) && "123".equals(user.getPsd())) { System.out.println("登陆成功!"); return user; } else { System.out.println("登陆失败!"); return null; } } public void register(User user) { System.out.println("注册成功!" + user.getUsername()); } }
service
public class UserService { private UserDao userDao = new UserDao(); public User longin(User user) { return userDao.login(user); } public void register(User user) { userDao.register(user); } }
loginServlet
@javax.servlet.annotation.WebServlet(name = "LoginServlet",urlPatterns = "/LoginServlet") public class LoginServlet extends javax.servlet.http.HttpServlet { protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { //得到用户带过来的数据,封装到Bean对象中 String username = request.getParameter("username"); String psd = request.getParameter("psd"); User user = new User(); user.setPsd(psd); user.setUsername(username); try { //调用Service方法 UserService userService = new UserService(); userService.longin(user); //登陆成功跳转到首页 request.getRequestDispatcher("/index.jsp").forward(request, response); } catch (Exception e) { e.printStackTrace(); //登陆失败,跳转到相关的提示页面 request.setAttribute("message","登陆失败了!!!"); request.getRequestDispatcher("/message.jsp").forward(request, response); } } protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { this.doPost(request, response); } }
registerServlet
@javax.servlet.annotation.WebServlet(name = "RegisterServlet",urlPatterns = "/RegisterServlet") public class RegisterServlet extends javax.servlet.http.HttpServlet { protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { //得到用户带过来的数据,封装到Bean对象中 String username = request.getParameter("username"); String psd = request.getParameter("psd"); User user = new User(); user.setPsd(psd); user.setUsername(username); try { //调用Service方法 UserService userService = new UserService(); userService.register(user); //注册成功跳转到登陆界面 request.getRequestDispatcher("/login.jsp").forward(request, response); //注册成功,我也可以跳转到首页 //request.getRequestDispatcher("/index.jsp").forward(request, response); } catch (Exception e) { e.printStackTrace(); //注册失败,跳转到相关的提示页面 request.setAttribute("message","注册失败了!!!"); request.getRequestDispatcher("/message.jsp").forward(request, response); } } protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { this.doPost(request, response); } }
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> <form action="${pageContext.request.contextPath}/LoginServlet" method="post"> 用户名:<input type="text " name="username"> 密码:<input type="password " name="psd"> <input type="submit" value="登陆"> </form> </body> </html>
register.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> <form action="${pageContext.request.contextPath}/RegisterServlet" method="post"> 用户名:<input type="text " name="username"> 密码:<input type="password " name="psd"> <input type="submit" value="注册"> </form> </body> </html>
上面的代码已经经过了测试,是可以跑起来的。
①:跳转页面的路径是写死的。我在注册成功了以后,我可以跳转到首页上,也可以跳转到登陆的界面上。如果我要选择其中的一个,就必须修改源代码…
②:一个功能对应一个Servlet,太麻烦了…写了LoginServlet,还要写RegisterServlet….