MVC架构(一)构建JSP+Servlet+JDBC结构的web项目

项目介绍

一个简单的javaweb项目,可以总结为通过MVC架构实现用户与数据交互的效果。而javaweb项目的MVC架构已经非常成熟,从最初的servlet+jsp+jdbc到SSH框架再到现在非常流行的SSM框架。本文利用JSP作为V(view)层,servlet作为C(controller)层,JDBC作为M(model)层,来搭建并体验一下原始javaweb项目。

搭建项目架构

  • 1、在http://blog.csdn.net/lk7688535/article/details/77480148讲过的使用maven构建web项目的基础上,开始我们的项目开发。

  • 2、引入servlet的jar包,在http://maven.aliyun.com中搜索servlet和mysql-jdbc,将dependency复制到pom.xml。

< dependency>
 < groupId>javax.servletgroupId>
 <artifactId>javax.servlet-apiartifactId>
  <version>4.0.0version>
 dependency>

 <dependency>
  <groupId>mysqlgroupId>
  <artifactId>mysql-connector-javaartifactId>
  <version>5.1.10version>
dependency>
  • 3、在main/java下
    创建com.leetech.action、com.leetech.dao、com.leetech.service、com.leetech.bean、com.leetech.util五个包。action包存放用于处理用户请求的servlet类,service包存放业务处理逻辑,bean包存放java bean,dao包存放jdbc与数据库的交互,util存放工具类文件。

从前端到后台

实现一个登陆请求

  • 4 、写一个jsp页面,里面放个form表单,用于处理用户请求到后台:
class="form-signin" role="form" action="userLoginAction" method="post"> type="text" name="username" class="form-control" placeholder="用户名" required autofocus /> type="password" name="password" class="form-control" placeholder="密码" required />
  • 5、写一个servlet类处理这个登录请求,这个servlet类要继承抽象类HttpServlet。

在该类上按两次ctrl+o可以查看父类(HttpServlet)的属性和方法。

通过快捷键alt+shift+s,并选择Override/Implement Methods即可选择父类的方法进行重写或实现。

一般可以重写的有doGet、doPost、service、init和destroy方法。

service方法是接口中的方法,servlet容器把所有请求发送到该方法,该方法默认行为是转发http请求到doXXX方法中,如果你重载了该方法,默认操作被覆盖,不再进行转发操作!

现在不论你的客户端是用pos还是get来请求此servlet 都会执行service方法也只能执行service方法,不会去执行doPost或是doGet方法。

get不能用于汉字的传参。

    private static final long serialVersionUID = 1L;
    public UserLoginAction(){
        System.out.println("LoginServlet构造函数");
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("servlet的doGet");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("servlet的doPost");
    }
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("执行servlet的service");
        req.setCharacterEncoding("utf-8"); 
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("登录的用户名和密码分别为"+username+password);
        //req.getRequestDispatcher("/subinfo.jsp").forward(req, resp);
         resp.sendRedirect("/MavenWeb/subinfo.jsp");
    }
    @Override
    public void init() throws ServletException {
        System.out.println("servlet初始化");
    }
    @Override
    public void destroy() {
        System.out.println("servlet销毁了");
    }

从处理请求最后的代码:

    //req.getRequestDispatcher("/subinfo.jsp").forward(req, resp);
     resp.sendRedirect("/MavenWeb/subinfo.jsp");

可以看到,处理完请求后的跳转方式有两种:redirect(重定向)和forward(转发)。

redirect:服务器收到request后向客户浏览器发送一个状态头请求,相当于两次请求,可以将页面跳转到任何页面,不一定局限于本web应用中。

forward:只能跳转到本web应用中的页面上,跳转后浏览器地址栏不会变化,相当于请求转发,即前后页面共享一个request,是在服务器端运行。

6、注册该servlet到web.xml。

<servlet>
    <servlet-name>loginServletservlet-name>
    <servlet-class>com.leetech.action.UserLoginActionservlet-class>
servlet>
<servlet-mapping>
    <servlet-name>loginServletservlet-name>
    <url-pattern>/userLoginActionurl-pattern>
servlet-mapping>

servlet3.0提供了注解的方式,可以直接在servlet类上写:

@WebServlet("/userSubinfoAction")
public class UserLoginAction extends HttpServlet{...}
//或者:
@WebServlet(name="loginAction",urlPatterns="/userSubinfoAction")
  • 7、servlet3.0上传文件

早期的servlet不支持文件上传,需要commons-fileUpload和commons-io的jar包,servlet3.0版本集成了文件上传功能,步骤如下:
(1)jsp中的form标签加入

enctype=”multipart/form-data”

(2)表单加入上传文件元素:

"photoFile" type="file" id="inputfile" class="col-sm-4">

(3)注册servlet类时的配置:
通过注解注册则在类上加入@MultipartConfig,通过xml注册则需在servlet标签里加入

 <multipart-config>multipart-config>  

两种配置都可设定文件的默认上传路径、单个文件最大值,所有文件最大值等属性。
(4)servlet类接收上传的文件并存储:

//只需两行代码完成上传文件的存储:
Part part = req.getPart("photoFile");
part.write( "F:/picture.png");
//还可以通过如下获得具体的文件信息
part.getSize();//文件大小
part.getContentType();//文件类型
part.getHeader("content-disposition");//form-data; name="photoFile"; filename="mavenWeb项目结构图.png"

从后台到数据库

实现用户注册

  • 8、前端填写用户信息:
    <form class="form-horizontal" enctype="multipart/form-data"  role="form" action="userSubinfoAction" method="post">
     <div class="form-group">
        <label for="inputName" class="col-sm-2 control-label">姓名label>
        <div class="col-sm-4">
            <input name="name" type="text" class="form-control" id="inputName" placeholder="请输入您的姓名">
        div>
    div>
     <div class="form-group">
         <label for="inputName" class="col-sm-2 control-label">性别label>
            <label class="radio-inline">
        <input type="radio" name="sex"  value="man" checked>label>
    <label class="radio-inline">
        <input type="radio" name="sex"   value="woman">label>
        div>
    <div class="form-group">
        <label  class="col-sm-2 control-label">家乡label>
        <select class=" col-sm-4" name="country">
            <option>大同option>
            <option>北京option>
            <option>广州option>
            <option>深圳option>
            <option>上海option>
        select>
    div>

      <div class="form-group">
        <label class="col-sm-2 control-label" for="inputfile">上传照片label>
        <input name="photoFile" type="file" id="inputfile" class="col-sm-4">
    div>
        <button class="btn btn-lg btn-warning btn-block" type="submit">注册button>
    form>

  • 9、Servlet获取前端提交的信息
@WebServlet("/userSubinfoAction")
@MultipartConfig
public class UserSubinfoAction extends HttpServlet{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        String savePath = req.getServletContext().getRealPath("/WEB-INF/uploadFile");
        System.out.println(savePath);
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        Part part = req.getPart("photoFile");
        String header = part.getHeader("content-disposition");
        System.out.println(header);
        part.write("F:/s.png");
        User user = new User();
        user.setUserName(req.getParameter("name"));
        user.setSex(req.getParameter("sex"));
        user.setCountry(req.getParameter("country"));
        user.setPhotoFile("F:/s.png");
        new UserService().subInfo(user);
    }
}
  • 10、数据提交给业务层处理,
new UserService().subInfo(user);

在service层新建UserService类,可以在方法中处理提交来的数据:

public class UserService {
        public void subInfo(User user){
            new UserDao().savaUser(user);
        }
}
  • 11、将数据提交给dao层,用于和数据库进行交互。
new UserDao().savaUser(user);

在dao层新建UserDao类,在方法中用于和数据库进行数据交互:

    public void savaUser(User user){
        Connection conn = DBConnect.getConn();

        String sql = "insert into user (username,sex,country,photo_file) values(?,?,?,?)";
        PreparedStatement pstmt;
        try {
            pstmt = (PreparedStatement) conn.prepareStatement(sql);
            pstmt.setString(1, user.getUserName());
            pstmt.setString(2, user.getSex());
            pstmt.setString(3, user.getCountry());
            pstmt.setString(4, user.getCountry());
           int i = pstmt.executeUpdate();
         if(i==1){
             System.out.println("注册成功");
         }else System.out.println("失败");
            pstmt.close();
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

补充:DBConnect类:

public class DBConnect {
    public static Connection getConn() {
        String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/MavenWeb";
        String username = "root";
        String password = "root";
        Connection conn = null;
        try {
            Class.forName(driver); //classLoader,加载对应驱动
            conn = (Connection) DriverManager.getConnection(url, username, password);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
}

整个注册的业务流程到现在就实现了,主要是为了快速搭建框架而记录,也穿插了一些小tips,这次的记录就到这里。

tips:

哪些是get方式呢?

form默认的提交方式
如果通过一个超链访问某个地址
如果在地址栏直接输入某个地址
ajax指定使用get方式的时候

哪些是post方式呢?

在form上显示设置 method=”post”的时候
ajax指定post方式的时候

others

在执行doGet()或者doPost()之前,都会先执行service()

由service()方法进行判断,到底该调用doGet()还是doPost()

Serlvet是单实例的(init和构造方法只会执行一次)

你可能感兴趣的:(MVC架构(一)构建JSP+Servlet+JDBC结构的web项目)