一.tomcat简介 tomcat 是 免费的web服务器1. 常见目录lib tomcat的类库bin tomcat的启动和关闭 startup.bat启动shutdown.bat 关闭启动后浏览器输入http://localhost:8080 出现tocmat图片即说明安装成功conf 配置文件目录webapps 存放web项目的目录在浏览器地址栏不可见work jsp 相关目录 已不使用2:webapp标准结构app--static--page--WEB-INFclasseslibweb.xmlapp本应用根目录static 非必要目录约定俗成的名称一般在此放静态资源(css js img)page 非必要目录一般存放html文档WEB-INF 必要目录必须叫WEB-INF受保护的资源目录浏览器通过url 不可以直接访问的目录WEB-INF 目录下的三个部分classes 字节码根路径lib 依赖的存放路径web.xml 项目的配置文件3.web项目的部署方式方式一直接将编译好的项目放在webapps目录下方式二: 将编译好的项目打成war包放在webapps目录下tomcat启动后 自动解压war包和第一种一样方式三可以将项目放在非webapps的其他目录在tomcat中通过配置文件指向app的实际磁盘路径idea关联tomcatFile 目录 选择 setttingsbuildExecutionDeployment 选择 Applicaiton Servers选择右侧的 选择tomcat server选择tomcat的路径即可4.idea开发web工程并部署1 点击file-settings-Applications Servers 添加 tomcat服务器2 新建一个webwokrspace 并使用idea打开并点击project Structure选择Module SDK3 新建一个module输入名称并保存 选中module 选择project Structure选中工程 在Dependencies 中点击 增加tomcat4 选中新建的module 右键 选择 Add Framework Support 在javaEE下勾选 web Application点击确定 工程变成web工程5选择build-build Artifacts 构建工程并生成可部署的war包6 在 运行左边的tomcat 下拉选择 edit configuration切换到Deployment 选择工程 部署Application context 配置的为浏览器工程访问路径点击确定 即可二http1.简介超文本传输协议是一个属于应用层面向对象的协议它是一种详细规定了浏览器和万维网服务器之间相互通信的规则通过网络传送万维网文档的数据传送协议客户端与服务端通信时传输的内容称为报文http协议就是规定报文的格式。客户端发送给服务器的称为请求报文服务器发送给客户端的称为响应报文交互方式请求 永远都是客户端向服务端发送响应 永远都是服务器向客户端返回数据格式请求时发送的数据称为请求报文响应时返回的数据称为响应报文报文是有规定的格式报文首部 请求报文 响应报文行 请求行 响应行头 请求头 响应头报文主体 请求体 响应体2.请求和响应报文请求报文格式请求首行get/post 资源路径参数 HTTP/1.10请求头信息请求头空行请求体post请求才有请求体响应报文格式响应行响应头响应体3.常见响应码200 请求成功浏览器会把响应内容通常时html显示在浏览器中302 重定向 表示服务器要求浏览器重新在发一个请求服务器会发送一个响应头location指定新请求的URL地址304 使用了本地缓存404 请求的资源没有找到说明客户端错误的请求了不存在的资源405 请求的方式不允许500请求资源找到了但是服务器内部出现了错误4.url与项目资源的对应关系三 servlet1.简介运行在服务器端tomcat的java 小程序是sun公司提供一套定义动态资源规范从代码层面上讲servlet就是一个接口--用来接收/处理客户端请求响应给浏览器的动态资源在整个web应用中servlet主要负责接收处理请求协同调度功能以及响应数据。我们把Servlet称为web应用中的控制器2.servlet开发流程1.创建JAVAWEB项目同时将tomcat添加为当前项目的依赖2.重写service方法service(HttpServlet reqHttpServletResponse resp)3.在service方法中 定义业务处理代码4.在web.xml中 配置servlet 对应的请求映射路径servletservlet-nameuserservlet/servlet-nameservlet-classcom.cn.HelloServlet/servlet-class/servletservlet-mappingservlet-nameuserservlet/servlet-nameurl-pattern/user/url-pattern/servlet-mappingurl-pattern 特殊配置/ 表示通配所有资源不包括jsp文件/* 表示通配所有资源包括jsp文件/a/* 匹配 所有以a前缀的映射路径*.action 匹配所有以action为后缀的映射路径注解配置servlet在具体的servlet 类加注解三种写法WebServlet(/s1)WebServlet(value/s1)WebServlet(UrlPatterns/s1)3.servlet 生命周期生命周期 对应方法 执行时机 执行次数构造对象 构造器 第一次请求或者容器启动 1初始化 init() 构造完毕后 1处理服务 service(HttpServletRequest 每次请求 多次req,HttpServletResponse resp)销毁 destory() 容器关闭 1Servlet 在Tomcat 中是单例的Servlet 的成员变量在多个线程栈之间共享不建议 在service 方法中修改成员变量在并发请求时会引发线程安全问题default-servlet 用于加载静态资源的servlet,默认随服务启动默认启动序号为14.servlet 继承结构1.顶级的Servlet接口public interface Servlet {//初始化方法构造完毕后由tomcat自动调用完成初始化功能的方法void init(ServletConfig var1) throws ServletException;//获得ServletConfig对象的方法ServletConfig getServletConfig();//接收用户请求向用于响应信息的方法void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;//返回Servlet字符串形式描述信息的方法String getServletInfo();// Servlet在回收前由tomcat调用的销毁方法往往用于做资源的释放工作void destroy();2.抽象的类 GenericServletpublic abstract class GenericServlet implements Servlet {private transient ServletConfig config;//将抽象方法改为普通方法在方法内部没有任何的实现代码public void destroy() {}public String getInitParameter(String name) {return this.getServletConfig().getInitParameter(name);}public EnumerationString getInitParameterNames() {return this.getServletConfig().getInitParameterNames();}public ServletConfig getServletConfig() {return this.config;}public ServletContext getServletContext() {return this.getServletConfig().getServletContext();}public String getServletInfo() {return ;}//tomcat 在调用Init方法时会读取配置信息进入一个ServletConfig对象并将该对象传入init方法public void init(ServletConfig config) throws ServletException {this.config config;this.init();}//重载的初始化方法我们重写初始化方法时对应的方法public void init() throws ServletException {}//再次抽象声明Service方法public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;public String getServletName() {return this.config.getServletName();}}3.抽象类的 HttpServlet侧重Service方法的处理public abstract class HttpServlet extends GenericServletpublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {HttpServletRequest request;HttpServletResponse response;try {request (HttpServletRequest)req;response (HttpServletResponse)res;} catch (ClassCastException var6) {throw new ServletException(lStrings.getString(http.non_http));}this.service(request, response);}5.servletConfigweb.xml 初始化配置信息servletservlet-nameservletconfig/servlet-nameservlet-classcom.cn.ServletConfigDemo/servlet-classinit-paramparam-namekeya/param-nameparam-valuevaluea/param-value/init-paraminit-paramparam-namekeyb/param-nameparam-valuevalueb/param-value/init-param/servlet//获取ServletConfig对象ServletConfig servletConfig getServletConfig();//获取指定初始化属性值String keya servletConfig.getInitParameter(keya);System.out.println(keyakeya);//获取所有初始化属性EnumerationString initParameterNames servletConfig.getInitParameterNames();while(initParameterNames.hasMoreElements()){String nextElement initParameterNames.nextElement();System.out.println(nextElement);}6.servletContextweb.xml 初始化配置信息context-paramparam-namecon1/param-nameparam-valuevaule1/param-value/context-paramcontext-paramparam-namecon2/param-nameparam-valuevaule2/param-value/context-param//获取servletContext对象ServletContext servletContext1 getServletContext();ServletConfig servletConfig getServletConfig();ServletContext servletContext2 servletConfig.getServletContext();ServletContext servletContext3 req.getServletContext();//域对象只有一个可以在多个Servlet之间共享属性System.out.println(servletContext1servletContext2);System.out.println(servletContext3servletContext2);//获取servletContext初始属性和属性值String con1 servletContext1.getInitParameter(con1);System.out.println(con1);EnumerationString initParameterNames servletContext1.getInitParameterNames();while(initParameterNames.hasMoreElements()){String element initParameterNames.nextElement();System.out.println(elementservletContext1.getInitParameter(element));}// 域对象 设置属性servletContext1.setAttribute(ka,va);// 域对象 获取属性String ka (String) servletContext1.getAttribute(ka);System.out.println(ka);//域对象修改属性servletContext1.setAttribute(ka,vaa);// 域对象 获取属性String ka (String) servletContext1.getAttribute(ka);System.out.println(ka);//域对象 删除属性servletContext1.removeAttribute(ka);7.HttpServletRequestHttpServletRequest 是一个接口其父接口是ServletRequestHttpServletRequest 是tomcat 将请求报文转换封装而来的对象在tomcat调用service方法时传入HttpServletRequest 代表客户端发来的请求所有请求中的信息可以通过该对象获得//获取方法String method req.getMethod();System.out.println(method);//获取协议String protocol req.getProtocol();System.out.println(protocol);//获取资源路径String requestURI req.getRequestURI();System.out.println(requestURI);//获取资源完整路径StringBuffer requestURL req.getRequestURL();System.out.println(requestURL);//客户端发送请求使用的端口号有可能时代理的int serverPort req.getServerPort();System.out.println(serverPort);//本应用容器端口号int localPort req.getLocalPort();System.out.println(localPort);//获取指定请求头信息String accpet req.getHeader(Accpet);System.out.println(accpet);//获取所有请求头信息EnumerationString headerNames req.getHeaderNames();while(headerNames.hasMoreElements()){String element headerNames.nextElement();System.out.println(element:req.getHeader(element));}//获取指定属性值String username req.getParameter(username);System.out.println(usernameusername);String password req.getParameter(password);System.out.println(paswordpassword);//获取参数的多个值String[] hobbies req.getParameterValues(hobby);System.out.println(hobby:Arrays.toString(hobbies));//获取所有参数EnumerationString parameterNames req.getParameterNames();while(parameterNames.hasMoreElements()){String element parameterNames.nextElement();String[] parameterValues req.getParameterValues(element);if(parameterValues.length1){System.out.println(elementArrays.toString(parameterValues));}else{System.out.println(elementparameterValues[0]);}}//获取属性map集合key属性value属性值MapString, String[] parameterMap req.getParameterMap();SetMap.EntryString, String[] entries parameterMap.entrySet();for (Map.EntryString, String[] entry : entries) {String key entry.getKey();String[] value entry.getValue();if(value.length1){System.out.println(keyArrays.toString(value));}else{System.out.println(keyvalue[0]);}}//设置响应码resp.setStatus(201);//设置响应内容resp.setContentType(text/html);//设置影响内容String infohello;PrintWriter writer resp.getWriter();writer.write(info);8.请求转发和重定向请求转发请求转发通过HttpServletRequest对象获取请求转发器实现请求转发是服务器内部的行为对客户端是屏蔽的客户端只发送了一次请求客户端地址栏不变服务端只产生了一对请求和响应对象这一对请求和响应会继续传递给下一个资源因为全程只有一个HttpServletRequest对象所以请求参数可以传递请求域中的数据也可以传递请求转发可以转发给其他Servlet动态资源也可以转发给一些静态资源以实现页面跳转请求转发可以转发给WEB-INF下受保护的资源该方式也是WEB—INF下的资源的唯一访问方式实现//获取转发器// RequestDispatcher dispatcher req.getRequestDispatcher(servletB);// RequestDispatcher dispatcher req.getRequestDispatcher(a.html);// RequestDispatcher dispatcher req.getRequestDispatcher(WEB-INF/b.html);RequestDispatcher dispatcher req.getRequestDispatcher(http://www.qq.com);//转发器发送dispatcher.forward(req,resp);重定向响应重定向通过HttpServletResponse对象的sendRedirect方法实现响应重定向是服务端通过302响应码和路径告诉客户端自己去找其他资源是在服务端提示下的客户端行为客户端至少发送了两次请求客户端地址栏是要变化的服务端产生了多对请求和响应对象且请求和响应对象不会传递给下一个资源因为全程产生了多个HttpServletRequest对象所以请求参数不可以传递请求域中的数据也不可以传递重定向可以是其他serlvet动态资源也可以是一些静态资源以实现页面跳转重定向不可以访问到WEB_INF下受保护的资源实现//响应重定向 设置响应状态码为302同时设置location响应头为servlet2// resp.sendRedirect(servlet2);// resp.sendRedirect(a.html);// resp.sendRedirect(WEB-INf/b.html);resp.sendRedirect(http://www.baidu.com);总结同样能够实现页面跳转优先使用响应重定向9.web访问图解四实例 实现用户注册和用户登录的前后台交互工程结构Model层代码service与实现类public interface SysUserService { /** 服务层 定义实现用户注册的功能 para用户对象 return返回影响的行数 */ int register(SysUser user); /** 服务层 定义实现用户登录的功能 para用户名 return返回影响的行数 */ SysUser login(String username) throws Exception; }public class SysUserServiceImpl implements SysUserService { private SysUserDao userdaonew SysUserDaoImpl(); Override public int register(SysUser user) { return userdao.addUser(user); } Override public SysUser login(String username) throws Exception { return userdao.findByName(username); } }dao层数据库操作的相关类public class BaseDao { //返回单个对象 public T T baseQueryObject(ClassT clazz, String sql, Object... args) throws SQLException { T t null; Connection connection JDBCUtil.getConnection(); ResultSet resultSet null; try { PreparedStatement preparedStatement connection.prepareStatement(sql); int rows 0; for (int i 0; i args.length; i) { preparedStatement.setObject(i 1, args[i]); } resultSet preparedStatement.executeQuery(); if (resultSet.next()) { t (T) resultSet.getObject(1); } } catch (SQLException e) { throw new RuntimeException(e); } finally { if (null ! resultSet) { resultSet.close(); } } return t; } //返回多个对象集合 public T ListT baseQuery(ClassT clazz, String sql, Object... args) throws Exception { T t null; Connection connection JDBCUtil.getConnection(); ListT list new ArrayList(); ResultSet resultSet null; try { PreparedStatement preparedStatement connection.prepareStatement(sql); for (int i 0; i args.length; i) { preparedStatement.setObject(i 1, args[i]); } resultSet preparedStatement.executeQuery(); ResultSetMetaData metaData resultSet.getMetaData(); int columnCount metaData.getColumnCount(); while (resultSet.next()) { Object obj clazz.newInstance(); for (int i 1; i columnCount; i) { String columnname metaData.getColumnLabel(i); Object value resultSet.getObject(columnname); if (value.getClass().equals(LocalDateTime.class)) { value Timestamp.valueOf((LocalDateTime) value); } Field field clazz.getDeclaredField(columnname); field.setAccessible(true); field.set(obj, value); } list.add((T) obj); } if (resultSet.next()) { t (T) resultSet.getObject(1); } } catch (SQLException e) { throw new RuntimeException(e); } finally { if (null ! resultSet) { resultSet.close(); } } return list; } //普通的增删改方法 public int baseUpdate(String sql, Object... args) throws Exception { Connection connection JDBCUtil.getConnection(); int rows 0; try { PreparedStatement preparedStatement connection.prepareStatement(sql); for (int i 0; i args.length; i) { preparedStatement.setObject(i 1, args[i]); } rows preparedStatement.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } finally { if (null ! connection) { connection.close(); } } return rows; } }public class SysUserDaoImpl extends BaseDao implements SysUserDao { Override public int addUser(SysUser user) { String sql insert into sys_user values(DEFAULT,?,?); try { return baseUpdate(sql, user.getUsername(), user.getUserPwd()); } catch (Exception e) { throw new RuntimeException(e); } } Override public SysUser findByName(String username) throws Exception { String sqlselect uid,username,password userPwd from sys_user where username?; ListSysUser sysUsers baseQuery(SysUser.class, sql, username); return (sysUsersnullsysUsers.size()0)?null:sysUsers.get(0); } }数据库连接工具类public class JDBCUtil { private static ThreadLocalConnection threadLocalnew ThreadLocalConnection(); private static DataSource dataSource; //初始化连接池 static { Properties properties new Properties(); InputStream resourceAsStream JDBCUtil.class.getClassLoader().getResourceAsStream(jdbc.properties); try { properties.load(resourceAsStream); } catch (IOException e) { throw new RuntimeException(e); } try { dataSource DruidDataSourceFactory.createDataSource(properties); } catch (Exception e) { throw new RuntimeException(e); } } public static DataSource getDateSource(){ return dataSource; } public static Connection getConnection() throws SQLException { return dataSource.getConnection(); } }控制层代码public class BaseController extends HttpServlet { Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String requestURI req.getRequestURI(); String[] splits requestURI.split(/); String mehodname splits[splits.length - 1]; Class aClass this.getClass(); try { //通过反射获取方法名并执行方法 Method declaredMethod aClass.getDeclaredMethod(mehodname, HttpServletRequest.class, HttpServletResponse.class); declaredMethod.invoke(this, req, resp); } catch (Exception e) { throw new RuntimeException(e); } } }WebServlet(/sysuser/*) public class SysUserController extends BaseController { private SysUserService userservice new SysUserServiceImpl(); protected void register(HttpServletRequest req, HttpServletResponse resp) throws Exception { //1.获取请求信息 String username req.getParameter(username); String password req.getParameter(userpwd); //封装请求信息 SysUser user new SysUser(); user.setUsername(username); user.setUserPwd(password); //调用服务层处理请求 int register userservice.register(user); //返回跳转信息 if(register0){ resp.sendRedirect(/registersucess.html); }else{ resp.sendRedirect(/registererror.html); } } protected void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1获取请求参数 String username req.getParameter(username); String userPwd req.getParameter(pwd); //调用服务层处理 SysUser sysuer null; try { sysuer userservice.login(username); } catch (Exception e) { e.printStackTrace(); }//返回跳转信息 if(nullsysuer){ resp.sendRedirect(/loginusernameerror.html); }else if( !userPwd.equals(sysuer.getUserPwd())){ resp.sendRedirect(/loginpassworderror.html); }else{ resp.sendRedirect(/loginsucess.html); } } }视图层代码login.html:!DOCTYPE html html langen head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 titleDocument/title style span{ font-family: Gill Sans, Gill Sans MT, Calibri, Trebuchet MS, sans-serif; color: red; } /style script //校验用户名 function checkusername(){ var reg/^[a-zA-Z0-9]{6,10}$/ var usernameobj document.getElementById(user1) var uservalueusernameobj.value var usercheckreg.test(uservalue) var sp1 document.getElementById(sp1) if(!usercheck){ sp1.innerText用户名格式不正确 return false } sp1.innerTextOK return true } //校验密码 function checkpassword(){ var reg/^\d{6}$/ var pwdobj document.getElementById(pw1) var pwdvaluepwdobj.value var pwdcheckreg.test(pwdvalue) var sp2 document.getElementById(sp2) if(!pwdcheck){ sp2.innerText密码格式不正确 return false } sp2.innerTextOK return true } function checksubmit(){ var flag1checkpassword() var flag2checkpassword() return flag1flag2 } /script link relstylesheet hrefstatic/css/bnt.css script srcstatic/js/bnt.js/script /head body h1 登录管理系统/h1 form action/sysuser/login methodget onsubmitreturn checksubmit() table cellspacing0px tr td用户名/td td input typetext nameusername iduser1 onblurcheckusername() span idsp1/spanbr /td /tr tr td密 码/td td input typepasswordnamepwd idpw1 onblurcheckpassword() span idsp2/spanbr /td /tr tr td colspan2 input typesubmit value登录 input typereset value重置 button a hrefregister.html注册/a /button /td /tr /form /table img srcstatic/img/leaf.jpg /body /htmlregister.html:!DOCTYPE html html langen head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 titleDocument/title style span{ font-family: Gill Sans, Gill Sans MT, Calibri, Trebuchet MS, sans-serif; color: red; } /style script //校验用户名 function checkusername(){ var reg/^[a-zA-Z0-9]{6,10}$/ var usernameobj document.getElementById(user1) var uservalueusernameobj.value var usercheckreg.test(uservalue) var sp1 document.getElementById(sp1) if(!usercheck){ sp1.innerText用户名不正确 return false } sp1.innerTextOK return true } //校验密码 function checkpassword(){ var reg/^\d{6}$/ var pwdobj document.getElementById(pw1) var pwdvaluepwdobj.value var pwdcheckreg.test(pwdvalue) var sp2 document.getElementById(sp2) if(!pwdcheck){ sp2.innerText密码不正确 return false } sp2.innerTextOK return true } //校验确认密码 function checkconformpassword(){ var reg/^\d{6}$/ var pwdobj2 document.getElementById(pw2) var pwdvalue2pwdobj2.value var pwdcheck2reg.test(pwdvalue2) var sp3 document.getElementById(sp3) if(!pwdcheck2){ sp3.innerText密码格式不正确 return false } //获取密码输入并和确认密码比较是否相等 var pwdobj document.getElementById(pw1) var pwdvaluepwdobj.value if(pwdvalue2!pwdvalue){ sp3.innerText密码和确认密码不相等 return false } sp3.innerTextOK return true } //表单提交校验 function checkregister(){ var flag1checkpassword() var flag2checkpassword() var flag3checkconformpassword() return flag1flag2flag3 } /script /head body h1 登录管理系统/h1 form action/sysuser/register methodget onsubmitreturn checkregister() table cellspacing0px tr td用户名/td td input typetext nameusername iduser1 onblurcheckusername() span idsp1/spanbr /td /tr tr td密 码/td td input typepasswordnameuserpwd idpw1 onblurcheckpassword() span idsp2/spanbr /td /tr tr td确认密 码/td td input typepassword idpw2 onblurcheckconformpassword() span idsp3/spanbr /td /tr tr td colspan2 input typesubmit value注册 input typereset value重置 button a hreflogin.html登录/a /button /td /tr /table /form /body /html