zoukankan      html  css  js  c++  java
  • maven小项目注册服务(三)--web模块

      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项目代码)。

  • 相关阅读:
    多个DataTable的合并成一个新表
    into #临时表的用法
    触发器获取更新前的数据
    C# 多个CSV文件合并成一个文件
    group by 字段名 with ROLLUP
    删除DataTable重复列,只针对删除其中的一列重复的行(转)
    动态注册jS
    JS 验证
    导出Excel
    C# 导入多个工作薄文件
  • 原文地址:https://www.cnblogs.com/silence-hust/p/4217971.html
Copyright © 2011-2022 走看看