一个简单的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>
在该类上按两次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")
早期的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"
<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>
@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);
}
}
new UserService().subInfo(user);
在service层新建UserService类,可以在方法中处理提交来的数据:
public class UserService {
public void subInfo(User user){
new UserDao().savaUser(user);
}
}
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;
}
}
form默认的提交方式
如果通过一个超链访问某个地址
如果在地址栏直接输入某个地址
ajax指定使用get方式的时候
在form上显示设置 method=”post”的时候
ajax指定post方式的时候
在执行doGet()或者doPost()之前,都会先执行service()
由service()方法进行判断,到底该调用doGet()还是doPost()
Serlvet是单实例的(init和构造方法只会执行一次)