java的web应用打包方式一般为war它和jar的区别就是包含了更多的资源和文件,如JSP文件,静态资源文件,servlet等等。war包的核心就WEB-INF文件夹下必须有一个web.xml 的配置文件,子目录classes包含所有该项目的类,子目录lib包含所有的依赖,这两个目录都会在运行的时候添加到classpath下。
maven对于web项目有统一的格式。项目代码和资源还是放在src/main/java和src/main/resources下,web资源目录在src/main/webapp/。webapp下就包含WEB-INF,css, js, jsp,等等文件夹。
这里account-service模块是综合之前三个模块,提供总的服务,直接看代码:
SignUpRequest对应表单的信息:
public class SignUpRequest { private String id; private String email; private String name; private String password; private String confirmPassword; private String captchaKey; private String captchaValue; private String activateServiceUrl; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getConfirmPassword() { return confirmPassword; } public void setConfirmPassword(String confirmPassword) { this.confirmPassword = confirmPassword; } public String getCaptchaKey() { return captchaKey; } public void setCaptchaKey(String captchaKey) { this.captchaKey = captchaKey; } public String getCaptchaValue() { return captchaValue; } public void setCaptchaValue(String captchaValue) { this.captchaValue = captchaValue; } public String getActivateServiceUrl() { return activateServiceUrl; } public void setActivateServiceUrl(String activateServiceUrl) { this.activateServiceUrl = activateServiceUrl; } }
接口实现:
public interface AccountService { String generateCaptchaKey() throws AccountServiceException; byte[] generateCaptchaImage(String captchaKey) throws AccountServiceException; void signUp(SignUpRequest signUpRequest) throws AccountServiceException; void activate(String activationNumber) throws AccountServiceException; void login(String id, String password) throws AccountServiceException; } public class AccountServiceImpl implements AccountService { private AccountPersistService accountPersist; private AccountEmailService accountEmail; private AccountCaptchaService accountCaptcha; private Map<String, String> activationMap = new HashMap<String, String>(); public AccountPersistService getAccountPersist() { return accountPersist; } public void setAccountPersist(AccountPersistService accountPersist) { this.accountPersist = accountPersist; } public AccountEmailService getAccountEmail() { return accountEmail; } public void setAccountEmail(AccountEmailService accountEmail) { this.accountEmail = accountEmail; } public AccountCaptchaService getAccountCaptcha() { return accountCaptcha; } public void setAccountCaptcha(AccountCaptchaService accountCaptcha) { this.accountCaptcha = accountCaptcha; } public String generateCaptchaKey() throws AccountServiceException { try { return accountCaptcha.generateCaptchaKey(); } catch (Exception e) { throw new AccountServiceException("Unable to generate captcha key",e); } } public byte[] generateCaptchaImage(String captchaKey) throws AccountServiceException { try { return accountCaptcha.generateCaptchaImage(captchaKey); } catch (Exception e) { throw new AccountServiceException("Unable to generate captcha image",e); } } public void signUp(SignUpRequest signUpRequest) throws AccountServiceException { try { if (!signUpRequest.getPassword().equals(signUpRequest.getConfirmPassword())) { throw new AccountServiceException("password donnot match"); } if (!accountCaptcha.validateCaptcha(signUpRequest.getCaptchaKey(), signUpRequest.getCaptchaValue())) { throw new AccountCaptchaException("captcha not match"); } Account account = new Account(); account.setId(signUpRequest.getId()); account.setEmail(signUpRequest.getEmail()); account.setName(signUpRequest.getName()); account.setPassword(signUpRequest.getPassword()); account.setActivated(false); accountPersist.createAccount(account); String activationId = RandomGenerator.getRandomString(); activationMap.put(activationId, account.getId()); String link = signUpRequest.getActivateServiceUrl().endsWith("/") ? signUpRequest.getActivateServiceUrl()+activationId : signUpRequest.getActivateServiceUrl()+ "?key="+activationId; accountEmail.sendMail(account.getEmail(), "please activate Your email", link); } catch (AccountCaptchaException e) { throw new AccountServiceException("unable to validate captcha", e); } catch (AccountEmailException e) { throw new AccountServiceException("unable to send email", e); } catch (AccountPersistException e) { throw new AccountServiceException("unable to create account", e); } } public void activate(String activationId) throws AccountServiceException { String accountId = activationMap.get(activationId); if (accountId == null) { throw new AccountServiceException("invalid account activated id"); } try { Account account = accountPersist.readAccount(accountId); account.setActivated(true); accountPersist.updateAccount(account); } catch (Exception e) { throw new AccountServiceException("Unable to activate"); } } public void login(String id, String password) throws AccountServiceException { try { Account account = accountPersist.readAccount(id); if (account == null) { throw new AccountServiceException("account donnot exits"); } if (!account.isActivated()) { throw new AccountServiceException("account not activate"); } if (!account.getPassword().equals(password)) { throw new AccountServiceException("password is error"); } } catch (AccountPersistException e) { throw new AccountServiceException("Unable to logging", e); } } }
注意service的配置文件中pom必须将email、captcha、persist这三个模块包含进去,依赖关系:
<dependency> <groupId>${project.groupId}</groupId> <artifactId>account-email</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>${project.groupId}</groupId> <artifactId>account-persist</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>${project.groupId}</groupId> <artifactId>account-captcha</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>com.icegreen</groupId> <artifactId>greenmail</artifactId> <version>${greenmail.version}</version> <scope>test</scope> </dependency>
account-web模块:
pom需要依赖servlet,service模块,其他的配置和一般的maven项目一样。
<dependencies> <dependency> <groupId>${project.groupId}</groupId> <artifactId>account-service</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.4</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </dependency> </dependencies>
web.xml:定义了一些servlet,具体的servlet实现代码在src/main/java 下。
<web-app> <display-name>Sample Maven Project: Account Service</display-name> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:/account-persist.xml classpath:/account-captcha.xml classpath:/account-email.xml classpath:/account-service.xml </param-value> </context-param> <servlet> <servlet-name>CaptchaImageServlet</servlet-name> <servlet-class>com.hust.silence.account.web.CaptchaImageServlet</servlet-class> </servlet> <servlet> <servlet-name>SignUpServlet</servlet-name> <servlet-class>com.hust.silence.account.web.SignUpServlet</servlet-class> </servlet> <servlet> <servlet-name>ActivateServlet</servlet-name> <servlet-class>com.hust.silence.account.web.ActivateServlet</servlet-class> </servlet> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.hust.silence.account.web.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>CaptchaImageServlet</servlet-name> <url-pattern>/captcha_image</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>SignUpServlet</servlet-name> <url-pattern>/signup</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ActivateServlet</servlet-name> <url-pattern>/activate</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> </web-app>
这个给出其中一个servlet的代码:对用户login的处理。
public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 929160785365121624L; private ApplicationContext context; @Override public void init() throws ServletException { super.init(); context = WebApplicationContextUtils.getWebApplicationContext( getServletContext() ); } @Override protected void doPost( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException { String id = req.getParameter( "id" ); String password = req.getParameter( "password" ); if ( id == null || id.length() == 0 || password == null || password.length() == 0 ) { resp.sendError( 400, "incomplete parameter" ); return; } AccountService service = (AccountService) context.getBean( "accountService" ); try { service.login( id, password ); resp.getWriter().print( "Login Successful!" ); } catch ( AccountServiceException e ) { resp.sendError( 400, e.getMessage() ); } } }
关于jsp界面只有两个:login.jsp和signup.jsp这个对于接触过web 的而言很简单了。
基本上这些内容大概就可以说明maven的好处和使用方法了,经过书上的讲解和自己的实际操练,对maven的使用会更加熟悉,当然自己用到的只是maven的皮毛,它的功能可 不仅仅只有这些,这些只是它的核心功能。如果能在实际项目中运用,并去学习的话会对maven有更深的了解,鉴于时间关系,我只能先了解个大概,之后若需要的时候能够快速的使用起来,也希望能在实验室项目中好好的使用这个工具。(有机会和时间的话,尝试重构实验室之前的web项目代码)。